2015-11-23 3 views
1

У меня есть представление коллекции, которое загружает данные из API. Collection View отлично работает, за исключением того, что он загружает только изображения на прокрутке. Я пробовал загружать изображения async, и это делает минимальную разницу. Я хочу, чтобы все изображения загружались или предварительно загружали изображение до загрузки изображения? Я использую Haneke для загрузки изображений с URL-адреса. Вот код, я использую в моей точки зрения коллекции:Collection View Loads Choppy

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return self.tableData.count 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell: ProductsViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("productViewCell", forIndexPath: indexPath) as! ProductsViewCell 

    let rowData = tableData[indexPath.row] 

    cell.backgroundColor = UIColor.whiteColor() 

    for (key,value) in rowData { 
     cell.productPrice.text = value["merged"][0]["variants"][0]["price"].string 
     cell.productName.text = value["merged"][0]["title"].string 


     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
      if let imageString = value["merged"][0]["images"][0]["src"].string { 
       let url = NSURL(string: imageString) 

       dispatch_async(dispatch_get_main_queue(), { 
        cell.productImage.contentMode = .ScaleAspectFill 
        cell.productImage.hnk_setImageFromURL(url!) 
       }) 
      } 
     }) 


     if let variantData = value["merged"][0]["variants"].array { 
      var sum = 0 

      for variant in variantData { 
       sum += variant["inventory_quantity"].int! 
      } 

      if sum <= 0 { 
       cell.soldOut.hidden = false 

      } else { 
       cell.soldOut.hidden = true 
      } 
     } 


    } 

    return cell 
} 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    print("Cell \(indexPath.row) selected") 
} 

ответ

1

Вы хотите сделать все загрузки главного потока, то после того, как данные изображения или изображение доступно отправка в основную очередь для обновления пользовательского интерфейса. Здесь вы идете в правильном направлении, но вы загружаете основной поток. Изменить это:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
      if let imageString = value["merged"][0]["images"][0]["src"].string { 
       let url = NSURL(string: imageString) 

       dispatch_async(dispatch_get_main_queue(), { 
        cell.productImage.contentMode = .ScaleAspectFill 
        cell.productImage.hnk_setImageFromURL(url!) 
       }) 
      } 
     }) 

To:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
      if let imageString = value["merged"][0]["images"][0]["src"].string { 
       let url = NSURL(string: imageString) 
       let imageData = NSData(contentsOfURL: imageString) 
       let image = UIImage(data: imageData) 

       dispatch_async(dispatch_get_main_queue(), { 
        cell.productImage.contentMode = .ScaleAspectFill 
        cell.productImage.image = image 
       }) 
      } 
     })