【问题标题】:Showing progress percentage while downloading a file from iCloud?从 iCloud 下载文件时显示进度百分比?
【发布时间】:2014-04-25 17:00:22
【问题描述】:

我想在从 iCloud 下载 UIDocument 时显示进度条。

我尝试从查询中保留对NSMetadataItem 的引用,每秒询问它的属性,但密钥NSMetadataUbiquitousItemPercentDownloadedKey 要么不存在,要么在下载文档后突然变为100

相关代码:

 // get meta data item from query

 NSNumber *downloadProgress = [self.documentMetadataItem valueForAttribute:NSMetadataUbiquitousItemPercentDownloadedKey];
    NSLog(@"download status: %@", downloadProgress);

【问题讨论】:

  • 显示你开发的代码。

标签: ios objective-c icloud nsmetadataquery


【解决方案1】:

您不应轮询NSMetadataItem 以获取更改,而应该只侦听来自NSMetadataQuery 的更新,并在每次收到更新时获取一次NSMetadataUbiquitousItemPercentDownloadedKey(并更新UI)。

(我认为现有的 NSMetadataItem 对象不会随着下载的进行而更新,除非从下载过渡到完全下载)。

这是一种使用 KVO 监听 NSMetadataQuery 更新的方法:

// To register for KVO updates:
[query addObserver:self
         forKeyPath:@"results"
            options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
            context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    // check that "object" is your metadata query then:
    NSUInteger changeKind = [[change objectForKey:NSKeyValueChangeKindKey] unsignedIntegerValue];

    switch (changeKind) {
        case NSKeyValueChangeSetting:
            // The whole array of results changed, update your model accordingly
            // ...
            break;
        case NSKeyValueChangeReplacement:
            // This is where you update your progress bar in most cases
            // Enumerate [change objectForKey:NSKeyValueChangeNewKey], this is a list of NSMetadataItems that will have all the desired properties
            break;
        case NSKeyValueChangeInsertion:
            // Handle a new document
            // ...
            break;
        case NSKeyValueChangeRemoval:
            // Handle a removed document
            // ...
            break;
    }
}

如果您仍然看到进度未更新,请向 Apple 提交错误。

【讨论】:

  • 现有的 NSMetadataItem 已更新。下载项目后会出现下载进度键。原始查询接收更新的频率不足以更新进度条。另外,在查询更新中,没有下载百分比键。
  • 您如何收听 NSMedataQuery 的更新?使用 KVO?根据我的经验,我确实获得了足够的进度条更新(大约每秒十几个)。
  • Thomas,您能否将代码添加到您的答案中?我只是每 0.5 秒轮询一次元数据项(作为测试的开始)
  • 感谢您的代码。我注册了一个回调,以便在查询出现新结果时调用(例如在 Apple 的文档中)。这工作正常,除了键 NSMetadataUbiquitousItemPercentDownloadedKey 大部分时间不存在,或者最后它突然出现 100 作为值。我想我必须提交一个错误......
  • 您应该发布您的代码示例。我真的想知道您是否正在查看正确的 NSMetadataItems...
猜你喜欢
  • 2021-10-28
  • 2017-12-21
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多