iCloud: обратный вызов для startDownloadingUbiquitousItemAtURL NSFileManager? - PullRequest
14 голосов
/ 13 марта 2012

Я использую NSFileManager startDownloadingUbiquitousItemAtURL для загрузки файла из iCloud в локальную копию (в этом случае у локальной пока нет копии файла).Я не могу найти обратный вызов для этого процесса.Мне нужен обратный вызов, чтобы сообщить моему приложению, что запрошенный файл закончен, загружен (в локальную копию), чтобы другая задача могла начать чтение содержимого файла и что-то делать.

Я могу проверить, загружен ли файл.Но это будет включать в опрос постоянно.Есть ли способ сделать это без установки таймера для опроса для этого?

Ответы [ 2 ]

29 голосов
/ 14 марта 2012

Я считаю, что этот метод предназначен для использования совместно с файловыми координаторами на основе документации 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
    });
});
0 голосов
/ 03 декабря 2012

Для правильной загрузки в 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];
...