16

を使用してiCloudからローカルコピーにファイルをダウンロードしています(この場合、ローカルにはまだファイルのコピーがありません)NSFileManagerstartDownloadingUbiquitousItemAtURLこのプロセスのコールバックが見つからないようです。他のタスクがファイルのコンテンツの読み取りを開始して処理を実行できるように、要求されたファイルのダウンロードが完了したことをアプリに通知するためのコールバックが必要です。

ファイルがダウンロードされているかどうかを確認できます。しかし、それは絶えずポーリングを伴うでしょう。これをポーリングするタイマーを設定せずにこれを行う方法はありますか?

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 に答える