(iOS) Чтение plist из папки «Документы» — я получаю правильный путь, но не могу загрузить словарь

Я знаю, что по этой проблеме уже есть множество тем, но я не могу найти ту, которая решает мою проблему. У меня есть список со словарем в качестве корня, содержащий три массива. Мой код для записи в plist отлично работает в симуляторе, но (нулевой) на устройстве.

  • Я не пытаюсь писать в пакет приложений,
  • Мой путь к файлу правильный, и я проверяю при запуске, чтобы убедиться, что файл существует в папке «Документы» (и он действительно существует).

    - (void) writeToPlist:(NSString *)fileName playerColor:(NSString *)player withData:(NSArray *)data
    {
        NSArray *sysPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory ,NSUserDomainMask, YES);
        NSString *documentsDirectory = [sysPaths objectAtIndex:0];
        NSString *filePath =  [documentsDirectory stringByAppendingPathComponent:fileName];
    
        NSLog(@"File Path: %@", filePath);
    
        NSDictionary *plistDict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
    
        NSLog(@"plist: %@", [plistDict description]);
    
        [plistDict setValue:data forKey:player];
    
        BOOL didWriteToFile = [plistDict writeToFile:filePath atomically:YES];
        if (didWriteToFile) {
            NSLog(@"Write to file a SUCCESS!");
        } else {
            NSLog(@"Write to file a FAILURE!");
        }
    }
    

Отладочный вывод:

    File Path: /var/mobile/Applications/CA9D8884-2E92-48A5-AA73-5252873D2571/Documents/CurrentScores.plist
    plist: (null)
    Write to file a FAILURE!

Я использовал этот же метод в других проектах, поэтому я не знаю, забыл ли я что-то или в чем дело. Я проверил орфографию/прописные буквы и переделал plist, ничего не изменилось.

Так почему же plistDict (null) на устройстве, а не на симуляторе? Прошу прощения, если пропустил решение в другом посте на plists.


person timgcarlson    schedule 09.05.2013    source источник
comment
Файл существует? Это не первый раз, когда вы вызываете этот метод.   -  person rmaddy    schedule 10.05.2013


Ответы (1)


Ваш код написан так, чтобы предположить, что файл уже существует в папке Documents. Этого не произойдет при первом вызове этого метода.

Вы должны добавить проверку существования файла. Если он есть, загрузите его. Если нет, выполните другую правильную инициализацию ваших данных при подготовке к записи.

Кроме того, ваш словарь должен быть изменяемым, чтобы вы могли изменять или добавлять ключи/значения.

- (void) writeToPlist:(NSString *)fileName playerColor:(NSString *)player withData:(NSArray *)data
{
    NSArray *sysPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory ,NSUserDomainMask, YES);
    NSString *documentsDirectory = [sysPaths objectAtIndex:0];
    NSString *filePath =  [documentsDirectory stringByAppendingPathComponent:fileName];

    NSLog(@"File Path: %@", filePath);

    NSMutableDictionary *plistDict; // needs to be mutable
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
    } else {
        // Doesn't exist, start with an empty dictionary
        plistDict = [[NSMutableDictionary alloc] init];
    }

    NSLog(@"plist: %@", [plistDict description]);

    [plistDict setValue:data forKey:player];

    BOOL didWriteToFile = [plistDict writeToFile:filePath atomically:YES];
    if (didWriteToFile) {
        NSLog(@"Write to file a SUCCESS!");
    } else {
        NSLog(@"Write to file a FAILURE!");
    }
}
person rmaddy    schedule 09.05.2013
comment
Если это так, разве его сборка симулятора не будет работать? - person Mark McCorkle; 10.05.2013
comment
@MarkM Обычно, но файл мог быть добавлен в симулятор другими способами в прошлом. Вот почему, готовясь отправить приложение в Apple для выпуска, вы всегда должны удалить приложение с устройства и выполнить чистую установку. Затем полностью протестируйте приложение, чтобы убедиться, что оно работает без ошибок. - person rmaddy; 10.05.2013
comment
Спасибо, это сработало! Как я и подозревал, это было что-то простое, чего я не замечал. Я думал, что проверки доступного для записи пути при запуске приложения было бы достаточно, но я думаю, что нет. - person timgcarlson; 10.05.2013