3

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;
    }
}
4

0 に答える 0