Core data 从iCloud中删除UIManagedDocument时,删除核心数据创建的日志文件的最佳方法是什么?

Core data 从iCloud中删除UIManagedDocument时,删除核心数据创建的日志文件的最佳方法是什么?,core-data,icloud,nsfilemanager,Core Data,Icloud,Nsfilemanager,我本以为NSFileManagers的removitematil:error:方法会删除在iCloud中使用UIManagedDocuments时创建的核心数据日志文件 确保删除所有这些日志文件的最佳方法是什么?我使用了 - (void)deleteRemnantsOfOldDatabaseDocumentAndItsTransactionLogsWithCompletionHandler:(completion_success_t)completionBlock { __wea

我本以为
NSFileManager
s的
removitematil:error:
方法会删除在iCloud中使用UIManagedDocuments时创建的核心数据日志文件

确保删除所有这些日志文件的最佳方法是什么?

我使用了

- (void)deleteRemnantsOfOldDatabaseDocumentAndItsTransactionLogsWithCompletionHandler:(completion_success_t)completionBlock
{    
    __weak CloudController *weakSelf = self;

    NSURL *databaseStoreFolder = self.iCloudDatabaseStoreFolderURL;
    NSURL *transactionLogFolder = self.transactionLogFilesFolderURL;

    [self deleteFileAtURL:databaseStoreFolder withCompletionBlock:^(BOOL docSuccess) {
        [weakSelf deleteFileAtURL:transactionLogFolder withCompletionBlock:^(BOOL logSuccess) {
            completionBlock(docSuccess && logSuccess);
        }];
    }];
}

- (void)deleteFileAtURL:(NSURL *)fileURL withCompletionBlock:(completion_success_t)completionBlock
{    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSFileCoordinator *fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
        NSError *coordinatorError = nil;
        __block BOOL success = NO;

        [fileCoordinator coordinateWritingItemAtURL:fileURL
                                            options:NSFileCoordinatorWritingForDeleting
                                              error:&coordinatorError
                                         byAccessor:^(NSURL *writingURL) {

                                             NSFileManager *fileManager = [[NSFileManager alloc] init];
                                             NSError *removalError = nil;
                                             if ([fileManager fileExistsAtPath:[writingURL path]]) {
                                                 if (![fileManager removeItemAtURL:writingURL error:&removalError]) {
                                                     NSLog(@"deleteFileAtURL: removal error: %@", removalError);
                                                 } else {
                                                     success = YES;
                                                 }
                                             } 
                                         }];

        if (coordinatorError) {
            NSLog(@"deleteFileAtURL: coordinator error: %@", coordinatorError);
        }

        completionBlock(success);
    });
}
注意:这是用于单个文档工具箱样式的应用程序,更多的目的是在创建全新文档之前清除iCloud容器,第一次在一个“显然”空的iCloud存储中。但我相信它可以在不需要太多工作的情况下进行调整

哎呀,如果没有:

typedef void (^completion_success_t)(BOOL success);
您可以调试iCloud容器的内容,并使用以下方法验证内容是否已被删除(老实说,我可能是从其他地方提取并修改的):

此外,还值得登录并检查iCloud商店中的实际内容。有时,设备普遍性容器中保留的内容与iCloud服务器文件夹结构中实际保留的内容之间存在差异。在所有这些之间,你可以很好地了解正在发生的事情

- (void)logDirectoryHierarchyContentsForURL:(NSURL *)url
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSDirectoryEnumerator *directoryEnumerator = [fileManager enumeratorAtURL:url
                                                   includingPropertiesForKeys:@[NSURLNameKey, NSURLContentModificationDateKey]
                                                                      options:NSDirectoryEnumerationSkipsHiddenFiles
                                                                 errorHandler:nil];

    NSMutableArray *results = [NSMutableArray array];

    for (NSURL *itemURL in directoryEnumerator) {
        NSString *fileName;
        [itemURL getResourceValue:&fileName forKey:NSURLNameKey error:NULL];

        NSDate *modificationDate;
        [itemURL getResourceValue:&modificationDate forKey:NSURLContentModificationDateKey error:NULL];

        [results addObject:[NSString stringWithFormat:@"%@ (%@)", itemURL, modificationDate]];
    }

    NSLog(@"Directory contents: %@", results);
}