在应用程序检索后,iCloud图像是否在iOS设备中缓存?

时间:2012-05-20 09:48:39

标签: objective-c ios uitableview icloud

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

2 个答案:

答案 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守护程序还负责同步文档版本。因此,如果其他人从其他设备更新了同一文档的较新版本,则无需担心。