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];
    }];
});

现在,尽管执行了上述操作,但文件似乎被删除了一段时间(很短),但有几次,删除的文档会在一秒或几秒后重新出现在云中。(我可以通过另一台设备上的 iCloud 设置或通过发送更新通知的查询来检查这一点)。仅在某些情况下,该文件仍被删除。这是怎么回事?

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

4

3 回答 3

12

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

于 2012-07-12T13:20:10.083 回答
3

这方面问题的一个可能来源是 UIDocument 的 documentState 在删除时按顺序通过这些状态...

8 (UIDocumentStateEditingDisabled)

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

然后 4 (UIDocumentStateSavingError) 删除。

因此,删除可能会与您收到 UIDocumentStateChangedNotification 状态正常时触发的代码作斗争。

我希望这可以帮助别人。

更新

而不是试图从 DocumentState 驱动一切,因为我尝试了一个月但没有成功(按照 Wenderlich 的例子)......

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

This seems much more robust and predictable. I do still see several DocumentState 8 and State 9s arriving to each device following a deletion, where I would expect to only see one, but that may be a different issue.

于 2014-07-10T09:51:05.403 回答
1

在我的例子中,“accommodatePresentedItemDeletionWithCompletionHandler:”通过在 UIDocument 被无意识地打开时强制关闭来阻止曾经删除的文件重新出现。您可以在此处查看它的用法:iCloud - 在另一台设备上重命名打开的文档有时会失败

于 2013-07-12T03:42:19.503 回答