iCloud守护程序缓慢上传离线完成的更改

时间:2012-03-08 04:14:26

标签: daemon sync offline icloud uidocument

当设备在线时进行更改时,iCloud守护程序似乎会在几秒钟内将更改上载到iCloud服务器。但是,我注意到当离线对本地iCloud容器进行更改然后设备上线时,iCloud守护程序在上载更改时不一致。重新建立连接后,我会在更改上传到iCloud服务器并被其他设备检测到之前经历几秒到30分钟的延迟。这是正常的吗?告诉iCloud守护程序强制上传的任何方法?

我只使用UIDocument的子类(创建,打开,更改,保存文件到iCloud容器)和NSMetadataQuery来检测更改。重新联机后,密钥NSURLUbiquitousItemIsUploadedKey的文件状态为false,可以长时间保持这种状态。我已经尝试重新保存文件以尝试强制iCloud守护程序上传更改但它似乎没有帮助。

1 个答案:

答案 0 :(得分:0)

我知道这是一个旧问题,但我已经遭受了这个问题很长一段时间,并且刚刚发现了原因,所以在其他人遇到这个问题的时候,这就是......

如果你使用NSURL的getResourceValue:forKey:error:方法,我猜你是因为你提到使用NSURLUbiquitousItemIsUploadedKey,你可以看到文件显然没有上传,因为NSURL 缓存< / strong>在特定情况下的资源价值。

主文档中没有提及,但是如果你深入了解NSURL.h,你会发现以下奇怪的措辞宝石,值得全面阅读,让影响陷入其中:

  

资源价值缓存的行为在两者之间略有不同   NSURL和CFURL API。

     

获取,设置或使用缓存资源值的NSURL方法   用于主线程,URL缓存的资源值   (除了作为临时属性添加的那些)下一个无效   主线程的运行循环运行的时间。

     

CFURL函数不会自动清除任何资源值   由URL缓存。客户端可以完全控制缓存   一生。如果您使用的是CFURL API,则必须使用   CFURLClearResourcePropertyCacheForKey或   CFURLClearResourcePropertyCache用于清除缓存的资源值。

     

返回给定资源键标识的资源值。这个   方法首先检查URL对象是否已缓存资源   值。如果是,则将缓存的资源值返回给调用者。如果   不,那么这个方法同步从中获取资源值   后备存储,将资源值添加到URL对象的缓存中,   并将资源值返回给调用者。资源的类型   值因资源属性而异(请参阅资源键定义)。如果   此方法返回YES,值用nil填充,表示   资源属性不可用于指定的资源,不可用   确定资源属性不是时发生错误   可用。如果此方法返回NO,则填充可选错误。   此方法目前仅适用于文件系统的URL   资源。符号出现在iOS 4中,但不执行任何操作。

基本上,如果你在主线程以外的任何线程上使用getResourceValue:它会缓存第一个结果,并且一次又一次地将同样的结果返回给你 。直觉,嗯?你认为那种东西会在文档中用粗体字标记,而不是埋在标题中......

对我来说,这表现为设备偶尔会“粘住”,因为他们认为某个特定网址没有下载,而实际上很久以前就已经有了。经常重新启动应用以解决问题。强制getResourceValue:forKey:error:仅在主线程上运行,最终在一击中摆脱了这种麻烦。