删除的UIDocument通常会从云中重新出现

时间:2012-06-25 08:12:33

标签: icloud

我正在处理云中的文档...... *将文档添加到云中 *从云中删除该文档 *不知何故,该文件几秒钟后重新出现。

以下是详细信息:

我像这样创建一个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];
    }];
});

现在尽管做了以上操作,看起来文件被删除了(短),但是有几次,删除的文件会在一秒或几秒后重新出现在云端。 (我可以通过其他设备上的iCloud设置或通过更新发送通知的查询来检查)。仅在某些情况下文件仍然被删除。发生了什么事?

我应该注意,即使从Settings-> iCloud删除文件也会导致上述模式。几秒后,该文件神奇地重新出现。时间问题?同步问题?

3 个答案:

答案 0 :(得分:9)

不要在文档打开时删除它们。 :-P

答案 1 :(得分:3)

这方面的一个可能的问题来源是你的UIDocument的documentState在删除时依次经过这些状态...

  

8(UIDocumentStateEditingDisabled)

     

然后0(UIdocumentStateNormal)可能更新文件名,

     

然后4(UIDocumentStateSavingError)删除。

因此,当您收到UIDocumentStateChangedNotification表示状态正常时,删除可能会对您的代码进行攻击。

我希望这有助于某人。

更新

而不是尝试从DocumentState驱动所有内容,因为我尝试了一个月未成功(遵循Wenderlich示例)......

对我来说,关键是将 tolePresentedItemDeletionWithCompletionHandler 添加到子类UIDocument,其中包含closeWithCompletionhandler:调用,在检测到删除时关闭所有设备上的打开文件。然后,它会向我的经理发布通知,以从源数据阵列中删除此项的实例。

这似乎更加强大和可预测。我仍然看到删除后有几个DocumentState 8和State 9到达每个设备,我希望只看到一个,但这可能是一个不同的问题。

答案 2 :(得分:1)

在我的情况下,“accomPresentedItemDeletionWithCompletionHandler:”通过在无意识地打开UIDocument时强制关闭来阻止一次删除文件重新出现。 您可以在此处查看其使用情况:iCloud - renaming open documents on another device sometimes fails