我有整个 Documents 文件夹的 NSFilePresenter。我曾经将文件放在 iCloud 容器中,如果文件在多个设备上同时创建,它们会被 iCloud 自动重命名。同时presentedSubitemAtURL:(didMoveToURL:
会通知我在某些设备上创建的某些文件已重命名。这很重要,因为这是我知道 iCloud 自动移动文件的唯一方式。
但是,现在我开始自己解决冲突并实施- (void)presentedSubitemAtURL:(NSURL *)url didGainVersion:(NSFileVersion *)version
,因为我并不总是希望 iCloud 简单地重命名文件,有时我想就地编写。
以与 iCloud 相同的方式将同一文件的冲突版本分离到两个文件的正确方法是什么?因此,如果两个设备同时写入file.txt
,我希望将其中一个文件移动到file 2.txt
.
到目前为止,我有选择最新版本文件的分辨率。
- (void)presentedSubitemAtURL:(NSURL *)url didGainVersion:(NSFileVersion *)version {
// bail if no conflicts
if(!version.isConflict) {
return;
}
// get all conflicts
NSArray* conflictVersions = [NSFileVersion unresolvedConflictVersionsOfItemAtURL:url];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(modificationDate)) ascending:NO];
// sort by recency
conflictVersions = [conflictVersions sortedArrayUsingDescriptors:@[ sortDescriptor ]];
// pick the most recent version
NSFileVersion *recentVersion = conflictVersions.firstObject;
// replace current item with the most recent version
NSError *replaceError;
if(![recentVersion replaceItemAtURL:url options:0 error:&replaceError]) {
return;
}
// mark all conflicts as resolved
for(NSFileVersion* fileVersion in conflictVersions) {
fileVersion.resolved = YES;
}
// clean up other versions
NSError *removeError;
if(![NSFileVersion removeOtherVersionsOfItemAtURL:url error:&removeError]) {
return;
}
}