Ios iCloud:NSFileManager的回调';开始下载两个相当的项目了吗?

Ios iCloud:NSFileManager的回调';开始下载两个相当的项目了吗?,ios,ios5,icloud,icloud-api,Ios,Ios5,Icloud,Icloud Api,我正在使用NSFileManager的startdownloadingbiquitousitemature将文件从iCloud下载到本地副本(在这种情况下,本地还没有该文件的副本)。我似乎找不到此进程的回调。我需要回调来告诉我的应用程序请求的文件已完成下载(到本地副本),以便其他任务可以开始读取文件内容并执行其他操作 我可以查看文件是否已下载。但这需要不断地进行投票。有没有一种方法可以在不设置计时器的情况下对此进行轮询?我认为此方法旨在与基于的文件协调器结合使用。因此,您需要使用如下文件协调器:

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


我可以查看文件是否已下载。但这需要不断地进行投票。有没有一种方法可以在不设置计时器的情况下对此进行轮询?

我认为此方法旨在与基于的文件协调器结合使用。因此,您需要使用如下文件协调器:

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,您还需要类似的东西(其他任何东西都不起作用:|)


NSFileCoordinator中的方法在同步模式下运行良好。在我的项目的后期阶段,我还需要异步版本——up对此投了赞成票!谢谢。@SpaceDog你说得对。我一直在处理这些API,坦率地说,就是那些糟糕的API。苹果创造的API可以分为两类:1)那些糟糕的API,被混淆为地狱、模糊、不完整和糟糕的文档;2)那些可以通过的API。没有设计良好的单一API。别误会我。我喜欢苹果的产品,但与开发者和API打交道的苹果并不是人们所知道的高标准的苹果。相反,@SpaceDog我现在把这些评论打印出来挂在墙上。你完美地总结了我的想法。我通常说苹果有两位首席执行官:蒂姆·库克(Tim Cook)经营着我们熟悉的苹果,撒旦(satan)经营着与开发者打交道的苹果。op要求下载,而不是上传
   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];