有没有办法异步加载CKAsset照片到UICollectionView? 在这一刻, 来自CKDatabase performQuery的queryCompletionHandler, 我得到CKResets的CKRecords列表, 然后将UICollectionView图像设置为CKAsset.fileURL.path, 然后我做[UICollectionView reload]
重新加载需要很长时间,因为它似乎同时下载所有图像。我想要做的是使用AsyncImageView(https://github.com/nicklockwood/AsyncImageView)在下载真实图像时显示占位符。
无法看到使用AsyncImageView(或任何其他库)加载CKAsset照片的方法,
有什么想法吗?
答案 0 :(得分:1)
使用operation.desiredKeys
属性也是一种选择。如果您提前知道记录的密钥,则可以使用它来记录或排除记录提取操作中的密钥,包括CKAsset
。
答案 1 :(得分:0)
在您的情况下,您的CKAsset文件直接链接到您为表结果获取的CKRecords。因此,您将在返回结果时获得可用资产。文件的可用性直接链接到返回的记录。有两种方法可以让它看起来更好。
对CKFetchRecordsOperation使用perRecordCompletionBlock。然后,当您执行查询时,所有记录将逐个进入。每次记录进来时,您都可以将其添加到tableView中。在这种情况下,在获取数据之前,您不会看到数据。行将逐一添加,直到您拥有所有行。
将每个CKAsset放入其自己的CKRecord中,并将原始记录中的引用添加到此资产记录中。然后查询原始记录以获取没有资产的数据,然后为每个单元格启动一个新的获取(将是异步,因此不需要做任何魔术,只需设置cels图像)以获取相关的资产记录然后只是资产。这种方法的好处是您将看到tableview中的所有数据,但在获取之前您将看不到相关图像。
注意:当您使用CKAsset.fileURL.path设置图像时,您只能在CloudKit完成块内执行此操作。 url位置是CloudKit缓存位置。您将无法知道该图像将在该位置停留多长时间。如果要确保文件仍然可用,则必须将其复制到文档文件夹。
答案 2 :(得分:0)
它很慢的另一个原因是[collectionView reloadData]在后台线程中完成。 一旦使用dispatch_get_main_queue()在主线程中完成,图像显示的速度比以前快得多。