Невозможно синхронизировать простой текстовый файл с iCloud (неверный дескриптор файла) - PullRequest
2 голосов
/ 03 января 2012

У меня проблемы с синхронизацией простого текстового файла, я получаю эту ошибку при попытке открыть его:

{NSFilePath = / private / var / mobile / Library / Mobile Documents / 4C224W52W5 ~ com ~ piso13 ~ opusDomini / currentLogPath, NSUnderlyingError = 0xde9b460 "Операция не может быть завершена. Дескриптор неверного файла"}

Вот как я его создаю

-(BOOL)createLogFolderFile{        

    NSString *uuid = nil;

    CFUUIDRef uuidRef = CFUUIDCreate(nil);

    uuid = (NSString*)CFUUIDCreateString(nil, uuidRef);

    CFRelease(uuidRef);    



    NSError *error = nil;

    [uuid writeToFile:[self filePath] atomically:NO encoding:NSUTF8StringEncoding error:&error];

    if (error) {

        NSLog(@"Error trying to create log file %@", error);        

        return FALSE;

    }

    else{

        return TRUE;

    }

}

-(NSString*)filePath{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *iCloudPath = [[fileManager URLForUbiquityContainerIdentifier:nil] path];

    return [iCloudPath stringByAppendingPathComponent:LOG_FOLDER_FILE_NAME];

}

Вот как я это прочитал:

-(NSString*)readLogFolderFromFile{

    NSError *error = nil;

    NSString *logFolder = [NSString stringWithContentsOfFile:[self filePath] encoding:NSUTF8StringEncoding error:&error];

    if (error) {

        NSLog(@"Error when trying to read log folder from file: %@" ,error);

        return nil;

    }

    else{

        return logFolder;

    }

}

Я использую NSMetadataQuery для поиска файла, Запрос на уведомление о завершении сбора информации дал положительные результаты.

Помощь

1 Ответ

5 голосов
/ 03 января 2012

Файл не был загружен. Похоже, NSMetadataQuery уведомляет о существовании файла в облаке. Чтобы получить файл, необходим дополнительный код:

Внутри queryDidFinishСбор уведомления:

 NSMetadataItem *item = [query resultAtIndex:0];
        self.metadataItem = item;
        BOOL isDownloaded = [[item valueForAttribute:NSMetadataUbiquitousItemIsDownloadedKey]boolValue];

  if (!isDownloaded) {
        NSError *error = nil;
        [[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL: [item valueForAttribute:NSMetadataItemURLKey] error:&error];
        NSLog(@"Start downloading file");
        if (error) {
            NSLog(@"Error trying to download file: %@", error);
        }
        else{
            [self lookForLogFolderFile];
            return;
        }

    }

lookForLogFolderFile просто снова запускает запрос. После нескольких звонков мой предмет загружается. Вы также можете использовать таймер между каждым вызовом, чтобы запустить NSMetadataQuery. В моем случае это просто текстовый файл с одной строкой.

...