Подтвердить что ты не робот

ICloud: Обратный вызов для NSFileManager startDownloadingUbiquitousItemAtURL?

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

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

4b9b3361

Ответ 1

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

Ответ 2

Чтобы правильно загрузить 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];