等待iCloud上传完成?

时间:2017-10-26 14:45:26

标签: ios upload icloud nsfilemanager nsmetadataquery

我目前正在使用类似以下的代码上传到我的iCloud容器:

NSData * data = ...;

NSURL * documentsURL =
    [[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier: @"com.somecontainer.id"] URLByAppendingPathComponent: @"Documents"];

NSURL * cloudFileURL =
    [NSURL fileURLWithPath: [documentsURL.path stringByAppendingPathComponent: @"test.sql"]];

if(nil != documentsURL &&
   ![[NSFileManager defaultManager] fileExistsAtPath: documentsURL.path])
{
    [[NSFileManager defaultManager] createDirectoryAtURL: documentsURL
                             withIntermediateDirectories: YES
                                              attributes: nil
                                                   error: NULL];
} // End of does not exist

[dataToSave writeToURL: cloudFileURL
               options: NSDataWritingAtomic
                 error: error];

这很好用,它会将数据写入我的iCloud容器,但如果我尝试使用以下内容快速查询容器:

filesMetadataQuery = [NSMetadataQuery new];
filesMetadataQuery.searchScopes = @[NSMetadataQueryUbiquitousDocumentsScope];
filesMetadataQuery.predicate = [NSPredicate predicateWithFormat:@"%K like '*.sql'", NSMetadataItemFSNameKey];

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(queryDidFinishGathering:)
                                             name: NSMetadataQueryDidFinishGatheringNotification
                                           object: nil];

[filesMetadataQuery startQuery];

文件没有显示,除非我将startQuery延迟几秒钟。我认为,一旦writeToURL:(这是一个阻止调用)结束,NSMetadataQuery应该能够立即找到它,但这似乎不是这样。

有没有其他方法可以上传到我的iCloud容器并验证一切都已完成?

1 个答案:

答案 0 :(得分:0)

我把它包裹在NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter: nil]; __block NSError * saveError = nil; [coordinator coordinateWritingItemAtURL: targetURL options: 0 error: error byAccessor: ^(NSURL *url) { [dataToSave writeToURL: url options: NSDataWritingAtomic error: &saveError]; }]; 中,似乎解决了这个问题。

NSMetadataQuery

现在,如果我直接运行c(),则会找到该文件。