【问题标题】:Wait for iCloud upload to be complete?等待 iCloud 上传完成?
【发布时间】:2018-04-08 00:23:15
【问题描述】:

我目前正在使用类似于以下的代码上传到我的 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 容器并验证一切是否已完成?

【问题讨论】:

    标签: ios upload icloud nsfilemanager nsmetadataquery


    【解决方案1】:

    我将它包裹在 NSFileCoordinator 中,它似乎已经解决了这个问题。

    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,则会找到该文件。

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2020-07-04
      • 2011-12-28
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多