7

クラウドでドキュメントを操作しています... * ドキュメントをクラウドに追加します * そのドキュメントをクラウドから削除します * どういうわけか、そのドキュメントは数秒後に再び表示されます。

詳細は次のとおりです。

このような UIDocument のインスタンスを作成します

    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:@"somenewfilename"];

    MyDoc* docTemp = [[MyDoc alloc] initWithFileURL:ubiquitousPackage];
    docTemp.mapContent = [NSString stringWithString:self.currentdocument.mapContent];

    [docTemp saveToURL:[docTemp fileURL] 
      forSaveOperation:UIDocumentSaveForCreating 
     completionHandler:^(BOOL success) {            
         if (success) {
             DLog(@"New document %@ saved/added: %@", newFilename, docTemp);
         }
         else {
             DLog(@"Failed saving new document: %@", newFilename);
         }
         [docTemp release];
     }];

次に、次のように後で削除します。

    NSURL* fileURL = self.currentdocument.fileURL;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)       {
    NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
    NSError* error = nil;
    [fileCoordinator coordinateWritingItemAtURL:fileURL options:NSFileCoordinatorWritingForDeleting error:&error byAccessor:^(NSURL* writingURL) {
        if (error != nil) {
            DLog(@"Error with %@! %@", fileURL, error);
            return;
        }
        DLog(@"Got writingURL: %@", writingURL);
        NSFileManager* fileManager = [[NSFileManager alloc] init];
        if ([fileManager removeItemAtURL:writingURL error:nil]) {
            DLog(@"Deleted %@!", writingURL);
        }
        else {
            DLog(@"ERROR Failed deleting %@!", self.currentdocument);
        }
        [fileManager release];
        [fileCoordinator release];
    }];
});

上記を実行したにもかかわらず、ファイルが (短い) 間削除されたように見えますが、削除されたドキュメントが 1 秒または数秒後にクラウドに再表示される場合がいくつかあります。(これは、別のデバイスの iCloud 設定、または更新に関する通知を送信するクエリを介して確認できます)。ファイルが削除されたままになる場合があります。どうしたの?

設定 -> iCloud からファイルを削除しても、上記のパターンが発生することに注意してください。ファイルは数秒後に魔法のように再表示されます。タイミングの問題?同期の問題?

4

3 に答える 3

12

Don't delete documents while they are open. :-P

于 2012-07-12T13:20:10.083 に答える
3

この領域で考えられる問題の原因の 1 つは、削除時に UIDocument の documentState がこれらの状態を順番に通過することです...

8 (UIDocumentStateEditingDisabled)

0 (UIdocumentStateNormal) はおそらくファイル名を更新します。

次に 4 (UIDocumentStateSavingError) で削除します。

したがって、削除は、状態が正常であることを示す UIDocumentStateChangedNotification を受け取ったときに起動するコードと戦っている可能性があります。

これが誰かに役立つことを願っています。

アップデート

DocumentStateからすべてを駆動しようとする代わりに、1か月間失敗しました(Wenderlichの例に従って)...

私にとって重要なのは、削除が検出されたときにすべてのデバイスで開いているファイルを閉じる closeWithCompletionhandler: 呼び出しを含む、サブクラス化された UIDocument に adaptPresentedItemDeletionWithCompletionHandler を追加することでした。次に、マネージャーに通知を投稿して、このアイテムのインスタンスをソース データ配列から削除します。

これは、はるかに堅牢で予測可能です。削除後に DocumentState 8 と State 9 が各デバイスに到着するのはまだ確認できますが、1 つしか表示されないと予想されますが、これは別の問題である可能性があります。

于 2014-07-10T09:51:05.403 に答える