【问题标题】:iCloud files keep reappearing after deleting删除后iCloud文件不断重新出现
【发布时间】:2013-08-22 02:41:39
【问题描述】:

我有以下设置: 我的应用程序将 UIDocument 实例写入 iCloud。文件同步,一切正常。但是当我尝试删除它们时,它们会不断重新出现。在我删除文件之前,我关闭它们。这是删除文件的代码:

- (void)deleteDocumentWithName:(NSString*)name completion:(void (^)(BOOL success))completion
{
[self stopQuery];
NSURL* toDelete = [self URLForFileWithName:name];

UIDocument* doc = [[UIDocument alloc] initWithFileURL:toDelete];

void (^deleteDocument)() = ^() {
    // Wrap in file coordinator
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {

        NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
        [fileCoordinator coordinateWritingItemAtURL:toDelete
                                            options:NSFileCoordinatorWritingForDeleting
                                              error:nil
                                         byAccessor:^(NSURL* writingURL) {
                                             // Simple delete to start
                                             NSFileManager* fileManager = [[NSFileManager alloc] init];
                                             NSError* error = nil;
                                             [fileManager removeItemAtURL:writingURL error:&error];

                                             if (error) {
                                                 LogError(@"%s - error while deleting file: %@", __PRETTY_FUNCTION__, error);
                                             }

                                             dispatch_async(dispatch_get_main_queue(), ^{
                                                 [_files removeObject:toDelete];

                                                 if (completion) {
                                                     completion((error == nil));
                                                 }

                                                 [self startQuery];
                                             });
                                         }];
    });
};

if (doc) {
    if (doc.documentState == UIDocumentStateNormal) {
        [doc closeWithCompletionHandler:^(BOOL success) {
            if (success) {
                deleteDocument();
            } else {
                if (completion) {
                    completion(NO);
                }
            }
        }];
    } else {
        deleteDocument();
    }
}
}

执行此方法后,我得到了几个 NSMetadataQueryDidFinishGatheringNotifications。首先它不包含已删除的文件。然后另一个 NSMetadataQueryDidFinishGatheringNotification 被捕获并再次包含已删除的文件。

我找不到原因。任何帮助表示赞赏。

【问题讨论】:

  • 为什么要在删除之前设置文档?这似乎是不必要的。我猜我会说你正在删除磁盘上的文件,但 UIDocument 的自动保存正在启动并再次保存它。您确定执行删除时它已关闭吗?此外,这取决于您的查询是如何设置的,但在执行删除时停止和启动查询似乎是不必要的。此外,stopQuery 不一定会立即停止(如果您需要,可能会使用 disableUpdates 代替)-来自 stopQuery 的文档:The receiver first completes gathering any unprocessed results.
  • 感谢您的回复。我没有弄清楚问题是什么,但是通过删除整个线程和背景螺柱并直接删除文件,文件管理器解决了问题。对我来说,代码现在似乎有点错误和肮脏。但是,嘿,它有效;-)
  • 很好!如果您在将来看到文档复活,请检查您在其他地方没有实例变量,该变量具有同一文档的打开副本。无论您多久从磁盘上删除一次,如果有一个 UIDocument 实例挂在您应用程序中其他位置的打开副本上,自动保存很可能会恢复它。您需要确保 instance 的文件副本也已关闭。但是恕我直言,线程和背景的东西,虽然在工作时真的很酷,但在开始工作时可能会很痛苦!有很多陷阱需要注意。不过还是值得的。
  • @RobGlassey 您的评论对我帮助很大,因为确保 UIDocument 已关闭并解除分配不仅解决了此文件重新出现问题,而且还解决了我的应用程序中一个重要的内存占用增加问题。谢谢!

标签: icloud crud delete-file uidocument


【解决方案1】:

我遇到了类似的问题。从 GCD 中移除 NSFileCoordinator 实例化的封装,然后您将能够执行删除操作(尽管  文档中最好在后台线程中进行此操作,这很奇怪,因为这样做实际上会导致无法-首先删除问题)

void (^deleteDocument)() = ^() {
    NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
        [fileCoordinator coordinateWritingItemAtURL:toDelete
            options:NSFileCoordinatorWritingForDeleting
            error:nil
            byAccessor:^(NSURL* writingURL) {
            // Simple delete to start
            NSFileManager* fileManager = [[NSFileManager alloc] init];
            NSError* error = nil;
            [fileManager removeItemAtURL:writingURL error:&error];

            if (error) {
            LogError(@"%s - error while deleting file: %@", __PRETTY_FUNCTION__, error);
            }

            [_files removeObject:toDelete];

            if (completion) {
            completion((error == nil));
            }

            [self startQuery];
        }];
};

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2016-04-14
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多