3

为了测试冲突,我一直在两台设备上保存同一文档的两个不同版本。然后,在这两种设备上,我将能够查看currentVersionOfItemAtURL以查看“获胜”版本(在两种设备上都是相同的)以及otherVersionsOfItemAtURLorremoveOtherVersionsOfItemAtURL以查看其他设备。

但是我现在似乎有一个处于奇怪状态的文档,currentVersionOfItemAtURL两个设备上的位置不同,并且没有otherVersionsOfItemAtURLor removeOtherVersionsOfItemAtURL。使用getResourceValue:forKey:withNSURLUbiquitousItemHasUnresolvedConflictsKey报告 URL 存在未解决的冲突,但我无法看到它们。

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

4

1 回答 1

2

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

解决方案是removeAndReturnErrorunresolvedConflictVersionsOfItemAtURL. 文档说(我的重点):“对于您不再需要的任何版本,请调用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
....
}];
于 2015-10-10T02:10:45.290 回答