0

有没有办法将 CKAsset 照片异步加载到 UICollectionView 中?目前,在 CKDatabase performQuery 的 queryCompletionHandler 中,我得到了带有 CKAssets 的 CKRecords 列表,然后将 UICollectionView 图像设置为 CKAsset.fileURL.path,然后我执行 [UICollectionView reload]

重新加载需要很长时间,因为它似乎同时下载了所有图像。我想要做的是在下载真实图像时使用 AsyncImageView ( https://github.com/nicklockwood/AsyncImageView ) 来显示占位符。

看不到使用 AsyncImageView(或任何其他库)加载 CKAsset 照片的方法,

有任何想法吗 ?

4

3 回答 3

1

使用该operation.desiredKeys属性也是一种选择。如果您提前知道记录的键,则可以使用它CKAsset在记录提取操作中包含或排除键,包括 s。

于 2015-12-27T03:21:27.900 回答
0

在您的情况下,您的 CKAsset 文件直接链接到您为表结果获取的 CKRecords。因此,在返回结果的那一刻,您将拥有可用的资产。文件的可用性与返回的记录直接相关。有两种方法可以使这看起来更好。

  1. 将 perRecordCompletionBlock 用于 CKFetchRecordsOperation。然后,当您执行查询时,所有记录将一一出现。每次输入记录时,您都可以将其添加到 tableView。在这种情况下,您在获取数据之前不会看到数据。行将一一添加,直到您拥有所有行。

  2. 将每个 CKAsset 放在它自己的 CKRecord 中,并在您的原始记录中添加对这个资产记录的引用。然后查询原始记录以获取没有资产的数据,然后为每个单元格启动一个新的获取(将是异步的,因此无需做任何魔术,只需设置 cels 图像)以获取相关的资产记录,然后只是资产。这种方法的好处是您将在 tableview 中看到所有数据,但在获取相关图像之前您不会看到相关图像。

注意:当您使用 CKAsset.fileURL.path 设置图像时,您只能在 CloudKit 完成块内执行此操作。url 位置是 CloudKit 缓存位置。您将无法知道该图像将在该位置停留多长时间。如果您想确保该文件仍然可用,您必须将其复制到您的文档文件夹中。

于 2015-05-27T06:27:48.713 回答
0

速度慢的另一个原因是 [collectionView reloadData] 是在后台线程中完成的。一旦使用 dispatch_get_main_queue() 在主线程中完成,图像的显示速度就会比以前快得多。

于 2015-05-31T15:18:07.570 回答