将 CKAsset 异步加载到 UICollectionView

Posted

技术标签:

【中文标题】将 CKAsset 异步加载到 UICollectionView【英文标题】:Load CKAssets into UICollectionView async 【发布时间】:2015-05-26 17:37:40 【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

感谢 @Edwin,现在使用 #2,将每个 CKAsset 放在自己的 CKRecord 中。【参考方案3】:

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

【讨论】:

以上是关于将 CKAsset 异步加载到 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

将 CloudKit 记录保存到本地文件保存除 CKAsset 之外的所有字段

Swift 3 使用 CKAsset 将图像发送到 CloudKit

从核心数据中保存 CKAsset

通过 segue 将 CKAsset 图像传递给 ViewController?

无法将 CKAsset 类型的值分配给 UIImage 类型

单个 CKRecord 中的一系列 CKAsset 是不是存在问题?