16

我正在使用NSFileManager'sstartDownloadingUbiquitousItemAtURL将文件从 iCloud 下载到本地副本(在这种情况下,本地还没有文件的副本)。我似乎找不到这个过程的回调。我需要回调来告诉我的应用程序请求的文件已完成下载(到本地副本),以便其他任务可以开始读取文件的内容并执行操作。

我可以检查文件是否已下载。但它会涉及不断的轮询。有没有办法在不设置计时器来轮询的情况下做到这一点?

4

2 回答 2

31

我相信此方法旨在与基于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
    });
});
于 2012-03-14T15:30:21.680 回答
-1

要正确上传到 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];
于 2012-12-02T23:30:02.057 回答