我正在使用NSFileManager
'sstartDownloadingUbiquitousItemAtURL
将文件从 iCloud 下载到本地副本(在这种情况下,本地还没有文件的副本)。我似乎找不到这个过程的回调。我需要回调来告诉我的应用程序请求的文件已完成下载(到本地副本),以便其他任务可以开始读取文件的内容并执行操作。
我可以检查文件是否已下载。但它会涉及不断的轮询。有没有办法在不设置计时器来轮询的情况下做到这一点?
我正在使用NSFileManager
'sstartDownloadingUbiquitousItemAtURL
将文件从 iCloud 下载到本地副本(在这种情况下,本地还没有文件的副本)。我似乎找不到这个过程的回调。我需要回调来告诉我的应用程序请求的文件已完成下载(到本地副本),以便其他任务可以开始读取文件的内容并执行操作。
我可以检查文件是否已下载。但它会涉及不断的轮询。有没有办法在不设置计时器来轮询的情况下做到这一点?
我相信此方法旨在与基于Apple 文档的文件协调器一起使用。所以你需要像这样使用文件协调器:
NSURL *itemURL = nil; // this is the URL you want to read from
__block NSData *data = nil;
NSError *error = nil;
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
[coordinator coordinateReadingItemAtURL:itemURL options:0 error:&error byAccessor:^(NSURL *newURL) {
data = [NSData dataWithContentsOfURL:newURL];
}];
但是,这将是同步的,因此如果您想异步执行某些操作,可以这样使用块:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// read info from the URL using the code above
dispatch_async(dispatch_get_main_queue(), ^{
// handle data read from the URL
});
});
要正确上传到 iCloud,您还需要这样的东西(其他任何东西都不起作用:|)
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSString *FileNS = @"myfile.dat";
NSURL *FileURL = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:FileNS ];
BYTE *data = NULL;//Put your file data in here
int FileSize = 0;//replace with your file size
NSData *myData = [[NSData alloc] initWithBytes:data length:FileSize];
[myData writeToFile:[FileURL path] atomically:YES];