【发布时间】:2016-05-28 15:51:12
【问题描述】:
我使用 CloudKit 作为我的 iOS 应用程序的服务器后端。我用它来存放一些相对静态的数据以及一些图像(CKAsset)。当我需要从公共数据库中实际获取这些资产时,我遇到了一个问题。它们以极其缓慢的速度加载。
我的用例是将图像加载到集合视图内的每个单元格中。这些图像只有 200kb 大小,但下载过程平均需要 2.2 秒才能完成下载并将图像设置在一个单元格中。为了比较,我获取了类似大小的库存图像的 URL,并使用 NSURLSession 加载它们。每张图片加载只需要 0.18 - 0.25 秒。
我尝试了多种从CK下载图像的不同方式:直接获取记录、查询和操作查询。他们都有相似的结果。在为单元设置图像之前,我还将调度回完成块内的主队列。
我的数据库设置为具有包含多个数据字段的主要对象。然后,我为照片设置了一个向后参考样式系统,其中每张照片都只有一个对主要对象的引用。这样我就可以按需加载照片,而不会阻塞主要数据。
看起来像这样:
主要对象:
title: String, startDate: Date
照片对象:
owner: String(reference to primary object), image: Asset
这是我尝试直接获取其中一张照片的示例请求:
let publicDb = CKContainer.defaultContainer().publicCloudDatabase
let configRecordId = CKRecordID(recordName: "e783f542-ec0f-46j4-9e99-b3e3ez505adf")
publicDb.fetchRecordWithID(configRecordId) { (record, error) -> Void in
dispatch_async(dispatch_get_main_queue()) {
guard let photoRecord = record else { return }
guard let asset = photoRecord["image"] as? CKAsset else { return }
guard let photo = NSData(contentsOfURL: asset.fileURL) else { return }
let image = UIImage(data: photo)!
cell.cardImageView.image = image
}
}
我似乎无法弄清楚为什么这些图片下载要花这么长时间,但如果我不能让它们在合理的时间内加载,这真的是一件非常棒的事情。
更新:我用较小的图像(23kb)尝试了获取操作。获取速度更快,从 0.3 到 1.1 秒不等。这更好,但仍然没有达到我对 CloudKit 应该能够提供的期望。
【问题讨论】:
-
您正在获取整条记录。该记录中是否有更多资产?您可以将其限制为仅图像字段。除此之外,您只需执行更新主队列中 UI 的最后一条语句。
-
@EdwinVermeer 带有资产的记录只有两个字段,一个是图像,另一个是引用其所有者的字符串值。我知道我可以将那些其他行移出调度到主队列,但这没有区别。 fetch 的完成块是永远被调用的东西,而不是该块内的性能。
-
您在哪种网络上进行测试?您可能想检查操作的优先级,也可以尝试手动获取记录,而不是使用便捷方法。
-
@mattsven 我已经在几种不同的网络条件下尝试过这个,所有这些都表现得非常好。我也尝试过 CK 提供的各种形式的记录请求。这包括通过 id 直接获取记录以及尝试使用高优先级操作进行获取。
-
@Jonathan 但问题仍然存在吗?这一切都在同一台设备上吗?您是否尝试过从 CloudKit 仪表板中删除所有数据并再次执行此操作?