当设备在线时进行更改时,iCloud守护程序似乎会在几秒钟内将更改上载到iCloud服务器。但是,我注意到当离线对本地iCloud容器进行更改然后设备上线时,iCloud守护程序在上载更改时不一致。重新建立连接后,我会在更改上传到iCloud服务器并被其他设备检测到之前经历几秒到30分钟的延迟。这是正常的吗?告诉iCloud守护程序强制上传的任何方法?
我只使用UIDocument的子类(创建,打开,更改,保存文件到iCloud容器)和NSMetadataQuery来检测更改。重新联机后,密钥NSURLUbiquitousItemIsUploadedKey的文件状态为false,可以长时间保持这种状态。我已经尝试重新保存文件以尝试强制iCloud守护程序上传更改但它似乎没有帮助。
答案 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:
仅在主线程上运行,最终在一击中摆脱了这种麻烦。