为了测试冲突,我一直在两台设备上保存同一文档的两个不同版本。在这两款设备上,我可以查看currentVersionOfItemAtURL
以查看“获胜”版本 - 两种设备上的相同版本 - 以及otherVersionsOfItemAtURL
或removeOtherVersionsOfItemAtURL
以查看其他设备
但是我现在似乎有一个处于奇怪状态的文档,其中currentVersionOfItemAtURL
在两个设备上不同,并且没有otherVersionsOfItemAtURL
或removeOtherVersionsOfItemAtURL
。使用getResourceValue:forKey:
和NSURLUbiquitousItemHasUnresolvedConflictsKey
报告网址未解决冲突,但我无法看到它们。
如果URL为NSURLUbiquitousItemHasUnresolvedConflictsKey报告为true,但是没有其他版本的URL,这意味着什么?这是我需要在生产应用程序中处理的情况吗?
答案 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
....
}];