我有一个简单的UITableView,其中每个单元格都有一个用户可能使用iOS设备相机拍摄的缩略图。
如果启用了iCloud,图像将保存在其中。但是我想知道在加载图像时是否会发生某种缓存,因为我注意到第一次加载时的速度很慢,即使在屏幕上显示单元格时再次调用该代码,图像显示速度也很快。
这是相关的代码片段,我省略了构建单元格的逻辑,我认为这是不相关的,因为问题在于其他方面:
- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// logic for retrieve data and build cell
NSURL *ubiquityUrl = [fm URLForUbiquityContainerIdentifier:nil];
NSURL *docURL = [ubiquityUrl
URLByAppendingPathComponent:[NSString stringWithFormat:@"P_%@_%@.jpg",imgId,@"thumbnail"]
isDirectory:NO];
// this a custom object extending UIDocument
IP2DataDocument *dataDocument = [[IP2DataDocument alloc] initWithFileURL:docURL];
[dataDocument openWithCompletionHandler:^(BOOL success) {
if (success) {
NSLog(@"iCloud document opened");
// logic for filling table cell picture
} else {
NSLog(@"failed opening document from iCloud");
}
}];
// returning cell
}
每次单元格显示时,我都可以在Xcode中看到“iCloud文档已打开”。 如果发生某种缓存,你能指出在哪里以及如何进行缓存吗?
答案 0 :(得分:1)
Document-based App Programming Guide for iOS说:
当您运行元数据查询以了解应用程序的iCloud文档时,查询结果是文档文件的占位符项(
NSMetadataItem
对象)。这些项包含有关文件的元数据,例如其URL和修改日期。文档文件不在iCloud容器目录中。在下列情况发生之前,不会下载文档的实际数据:
- 您的应用程序尝试打开或访问该文件,例如通过调用
openWithCompletionHandler:
。- 您的应用程序调用{{1}}方法
NSFileManager
以明确下载数据。
总结一下:第一次打开文档时,它可能尚未从iCloud下载,这就是为什么它需要更长时间。之后,该文件的本地副本显然更快阅读。
答案 1 :(得分:0)
这是你的docURL或特别
NSURL *ubiquityUrl = [fm URLForUbiquityContainerIdentifier:nil];
您无法直接访问iCloud。您访问启用了iCloud的等效本地位置(ubiquityUrl)。如果您尝试获取的文件尚未在本地下载,则本地iCloud守护程序将在您访问时下载它。一旦发生这种情况,它将在本地存储在您的设备中。所以下一次,你尝试使用docURL再次访问它,因此更快。此外,iCloud守护程序还负责同步文档版本。因此,如果其他人从其他设备更新了同一文档的较新版本,则无需担心。