2016-04-23 3 views
0

Я загружаю табличное представление изображений, которые извлекаются из общедоступной базы данных CloudKit как CKAssets. Однако изображения не работают порядка двух секунд, пока правильное изображение не будет загружено в UIImageView пользовательской ячейки UITableview. Я знаю, что проблема заключается в том, что, поскольку ячейка повторно используется, изображение по-прежнему загружается из CloudKit и отображается в любой видимой ячейке, пока пользователь прокручивает TableView до того, как на изображении будет показано правильное изображение. Мне интересно, есть ли исправление для этого в быстром, чтобы загруженное изображение было только для видимой ячейки, а не любых предыдущих ячеек.Изображения от CKAsset Load Out of Order in Swift

Вот код для cellForRowAtIndexPath:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! PostsTableViewCell 
    cell.userInteractionEnabled = false 

    photoRecord = sharedRecords.fetchedRecords[indexPath.row] 

    cell.photoTitle.text = photoRecord.objectForKey("photoTitle") as? String 

    cell.photoImage.backgroundColor = UIColor.blackColor() 
    cell.photoImage.image = UIImage(named: "stock_image.png") 

    if let imageFileURL = imageCache.objectForKey(self.photoRecord.recordID) as? NSURL { 
     cell.photoImage.image = UIImage(data: NSData(contentsOfURL: imageFileURL)!) 
     cell.userInteractionEnabled = true 
     print("Image Cached: \(indexPath.row)") 
    } else { 

     let container = CKContainer.defaultContainer() 
     let publicDatabase = container.publicCloudDatabase 
     let fetchRecordsImageOperation = CKFetchRecordsOperation(recordIDs:[self.photoRecord.recordID]) 
     fetchRecordsImageOperation.desiredKeys = ["photoImage"] 
     fetchRecordsImageOperation.queuePriority = .VeryHigh 

     fetchRecordsImageOperation.perRecordCompletionBlock = {(record:CKRecord?, recordID:CKRecordID?, error:NSError?) -> Void in 
      if let imageRecord = record { 
       NSOperationQueue.mainQueue().addOperationWithBlock() { 
        if let imageAsset = imageRecord.objectForKey("photoImage") as? CKAsset{ 
         cell.photoImage.image = UIImage(data: NSData(contentsOfURL: imageAsset.fileURL)!) 
         self.imageCache.setObject(imageAsset.fileURL, forKey:self.photoRecord.recordID) 
         cell.userInteractionEnabled = true 
         } 
        } 
       } 
      } 
     publicDatabase.addOperation(fetchRecordsImageOperation) 
     } 
    return cell 
} 

Заранее спасибо!

ответ

1

Существует латентность между тем, когда отображается ваш вид таблицы и когда вызывается fetchRecordsImageOperation.perRecordCompletionBlock. В течение этого времени пользователь может прокрутить представление таблицы, в результате чего ячейка представления таблицы будет отменена и запрошена с помощью другого indexPath и различных связанных с ним данных, если вы не проверите, что индексный путь ячейки такой же, как при построении fetchRecordsImageOperation.perRecordCompletionBlock, это line: cell.photoImage.image = UIImage(data: NSData(contentsOfURL: imageAsset.fileURL)!) приведет к тому, что изображение будет помещено в ячейку, которая уже отображает разные данные. Вы можете изменить свой блок завершения, чтобы избежать этого.

if let imageRecord = record { 
       NSOperationQueue.mainQueue().addOperationWithBlock() { 
        if let imageAsset = imageRecord.objectForKey("photoImage") as? CKAsset{ 
         if indexPath == tableView.indexPathForCell(cell){ 
          cell.photoImage.image = UIImage(data: NSData(contentsOfURL: imageAsset.fileURL)!) 
         } 
         self.imageCache.setObject(imageAsset.fileURL, forKey:self.photoRecord.recordID) 
         cell.userInteractionEnabled = true 
         } 
        } 
       } 
+0

Это именно то, что мне нужно! Я думал, что это проблема, но я не был уверен, где реализовать решение в cellForRowAtIndexPath. Еще раз спасибо! –

0

Вы находите ответ здесь, я верю, я, естественно, склоняюсь к тому, что я его написал.

How to determine when all images have been downloaded from a set in Swift?

Вы должны настроить изображение на дисплее во время его загрузки изображения и показать, что так, что пользователь понимает, что происходит?