当URL为NSURLUbiquitousItemHasUnresolvedConflictsKey报告为true但是没有其他版本的URL时,这意味着什么?

时间:2012-06-20 17:54:12

标签: icloud uidocument nsfileversion

为了测试冲突,我一直在两台设备上保存同一文档的两个不同版本。在这两款设备上,我可以查看currentVersionOfItemAtURL以查看“获胜”版本 - 两种设备上的相同版本 - 以及otherVersionsOfItemAtURLremoveOtherVersionsOfItemAtURL以查看其他设备

但是我现在似乎有一个处于奇怪状态的文档,其中currentVersionOfItemAtURL在两个设备上不同,并且没有otherVersionsOfItemAtURLremoveOtherVersionsOfItemAtURL。使用getResourceValue:forKey:NSURLUbiquitousItemHasUnresolvedConflictsKey报告网址未解决冲突,但我无法看到它们。

如果URL为NSURLUbiquitousItemHasUnresolvedConflictsKey报告为true,但是没有其他版本的URL,这意味着什么?这是我需要在生产应用程序中处理的情况吗?

1 个答案:

答案 0 :(得分:2)

我按照Apple示例代码解决冲突,但是在使用(旧)文档和数据存储(不是iCloud Drive)测试iOS8时发现设置NSFileVersion属性resolved = TRUE是不够的。 setResolved有时会失败。

解决方法是在removeAndReturnError上的结果上调用unresolvedConflictVersionsOfItemAtURL。文件说(我的重点): “对于您不再需要的任何版本,请调用removeAndReturnError: NSFileVersion方法来回收文件的存储。文档修订将保留在服务器上,直到您删除它们为止。”

for (NSFileVersion *v in [NSFileVersion unresolvedConflictVersionsOfItemAtURL:conflictURL])
        if ([v removeAndReturnError:&error] == NO)
            MRLOGERROR(error);

这似乎解决了这个问题。

注意我不会担心currentVersionOfItemAtURL设备之间存在差异。我知道它基本上是任意的,取决于设备上发生的订单更改。

另请注意,所有冲突解决操作都应包含在文件协调器中:

[[[NSFileCoordinator alloc] initWithFilePresenter:nil]
 coordinateWritingItemAtURL:self.conflictFileName options:0 error:&coordError byAccessor:
 ^(NSURL *conflictURL) {
....
/// resolve conflicts here
....
}];