异步加载 CKAssets 到 UICollectionView

Load CKAssets into UICollectionView async

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

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

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

有什么想法吗?

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

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

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

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

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

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