1

我有一个简单的 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 文档”。如果发生某种缓存,您能指出在哪里以及如何进行吗?

4

2 回答 2

1

iOS的基于文档的应用程序编程指南说:

当您运行元数据查询以了解应用程序的 iCloud 文档时,查询结果是NSMetadataItem文档文件的占位符项目(对象)。这些项目包含有关文件的元数据,例如其 URL 和修改日期。文档文件不在 iCloud 容器目录中。

在发生以下情况之一之前,不会下载文档的实际数据:

  • 您的应用程序尝试打开或访问该文件,例如通过调用openWithCompletionHandler:.
  • 您的应用程序调用该NSFileManager方法startDownloadingUbiquitousItemAtURL:error:来显式下载数据。

总结一下:第一次打开文档时,它可能还没有从 iCloud 下载,这就是为什么它需要更长的时间。之后,有一个文件的本地副本,显然读取速度更快。

于 2012-05-20T16:03:20.577 回答
0

这是您的 docURL 或特别

NSURL *ubiquityUrl = [fm URLForUbiquityContainerIdentifier:nil];

您实际上并没有直接访问 iCloud。您访问启用了 iCloud 的等效本地位置 (ubiquityUrl)。如果您尝试获取的文件尚未在本地下载,则本地 iCloud 守护程序将在您访问时下载它。一旦发生这种情况,它就会本地存储在您的设备中。因此,下一次,您尝试使用 docURL 再次访问它,因此速度要快得多。iCloud 守护进程还负责同步您的文档版本。因此,如果其他人从另一台设备更新了同一文档的较新版本,您无需担心。

于 2012-05-20T15:55:33.733 回答