我目前正在使用类似以下的代码上传到我的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容器并验证一切都已完成?
答案 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()
,则会找到该文件。