Documents フォルダー全体に NSFilePresenter があります。以前はファイルを iCloud コンテナに入れていましたが、ファイルが複数のデバイスで同時に作成された場合、iCloud によって自動的に名前が変更されました。同時に、presentedSubitemAtURL:(didMoveToURL:
特定のデバイスで作成された特定のファイルの名前が変更されたことを通知します。ファイルが iCloud によって自動的に移動されていることを知る唯一の方法であるため、これは重要です。
- (void)presentedSubitemAtURL:(NSURL *)url didGainVersion:(NSFileVersion *)version
ただし、 iCloud でファイルの名前を変更するだけではなく、インプレースで書き込みたい場合もあるため、競合を自分で解決して実装するようになりました。
iCloud と同じ方法で、同じファイルの競合するバージョンを 2 つのファイルに分ける適切な方法は何ですか? したがって、両方のデバイスがfile.txt
同時に書き込みを行った場合、ファイルの 1 つを に移動する必要があります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;
}
}