0

パブリック CloudKit データベースから CKAssets としてフェッチされている画像のテーブルビューを読み込んでいます。ただし、正しい画像がカスタム UITableview セルの UIImageView に読み込まれるまで、画像は約 2 秒間順不同で読み込まれます。問題は、セルが再利用可能であるため、イメージ ビューに正しいイメージが表示される前に、ユーザーが TableView をスクロールしている間、CloudKit からイメージがダウンロードされ、表示されているセルに表示されることです。ダウンロードされた画像が可視セルの画像のみであり、以前のセルではないように、これを迅速に修正できるかどうか疑問に思っています。

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
}

前もって感謝します!

4

2 に答える 2

1

fetchRecordsImageOperation.perRecordCompletionBlockテーブル ビューが表示されてからが呼び出されるまでの間に遅延があります。その時間内にユーザーがテーブル ビューをスクロールすると、テーブル ビュー セルがデキューされ、別の indexPath とそれに関連付けられた別のデータで再キューイングされる可能性があります。セルのインデックス パスが作成時と同じであることを確認しないとfetchRecordsImageOperation.perRecordCompletionBlock、この行: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
                        }
                    }
                }
于 2016-04-23T16:39:58.243 に答える
0

ここに答えがあると思います。もちろん、私が書いたので偏っています。

すべての画像がSwiftのセットからいつダウンロードされたかを判断する方法は?

画像の読み込み中に表示する画像を設定し、ユーザーが何が起こっているのかを理解できるように表示する必要がありますか?

于 2016-04-24T17:04:29.723 に答える