Как использовать arrayWithContentsOfFile для загрузки файла, успешно записанного с помощью writeToFile в ObjectiveC / XCode

Я сохраняю массив настраиваемых объектов в файл списка plist следующим образом:

+(void) arrayToPlist: (NSArray*) plant_types{
    NSMutableArray* dictionary_array = [NSMutableArray arrayWithCapacity: plant_types.count];

    for(int i = 0; i<plant_types.count; i++){
        PlantType* pt = [plant_types objectAtIndex: i];
        [dictionary_array addObject: [pt toDict]];
    }

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* filePath    = [rootPath stringByAppendingPathComponent:@"PlantTypes.plist"];
    NSLog(@"Writing plist to: %@", filePath);

    [dictionary_array writeToFile: filePath atomically: YES];  
}

Это создает файл, который выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>name</key>
        <string>Autumn Olive</string>
        <key>radius</key>
        <real>10</real>
    </dict>
    <dict>
        <key>name</key>
        <string>Dwarf Cherry</string>
        <key>radius</key>
        <real>5</real>
    </dict>
    <dict>
        <key>name</key>
        <string>Bamboo</string>
        <key>radius</key>
        <real>2</real>
    </dict>
    <dict>
        <key>name</key>
        <string>Pomegranate</string>
        <key>radius</key>
        <real>6</real>
    </dict>
    <dict>
        <key>name</key>
        <string>Lupin</string>
        <key>radius</key>
        <real>0.60000002384185791</real>
    </dict>
</array>
</plist>

И загружает их таким образом:

+(NSMutableArray*) arrayFromPlist{
    NSLog(@"Loading array of plant types from plist.");

    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* filePath    = [rootPath stringByAppendingPathComponent:@"PlantTypes.plist"];
    NSFileManager*  fileManager = [NSFileManager defaultManager];

    if([fileManager fileExistsAtPath:filePath]){ 
        NSLog(@"Plist file exists at expected location.");
        NSMutableArray* plant_dicts = [NSMutableArray arrayWithContentsOfFile:filePath];
        NSLog(@"Loaded array with contents of file, got %d plant types.", plant_dicts.count);
        NSMutableArray* plant_types = [NSMutableArray arrayWithCapacity: plant_dicts.count];
        for(int i = 0; i< plant_dicts.count; i++){
            NSMutableDictionary* dict = [plant_dicts objectAtIndex: i];
            [plant_types addObject: [PlantType fromDict: dict]];
        }
        return plant_types;
    }
    NSLog(@"Plant Type plist file not found.");
    return NULL;
}

Никаких сбоев, но каждый раз, когда я возвращаю NSMutableArray нулевого размера (и этот оператор регистрации подтверждает, что plant_dict s имеет нулевой размер).

Что я делаю не так? Все похожие проблемы, которые я наблюдаю с arrayWithContentsOfFile: - это люди, создающие список вручную или с помощью редактора ... Я бы подумал, что создание этого из самого кода не будет иметь этих проблем ...

Редактировать: Я подтвердил, что больше не получаю результат с нулевым размером (что странно, с момента публикации исходного сообщения в этом разделе не было изменений кода). Однако я все еще не загружаю вещи правильно. Вот мои методы fromDict и toDict.

Проблема в том, что строка "shape" загружается неправильно. По крайней мере, когда я спрашиваю, если shape == @ "Circle", я понимаю, что это не так, даже если это явно так в заявлении NSLog. Я провожу идентичное сравнение в другом месте кода (при проверке того, как визуализировать объект), и там он отлично работает (поэтому я предполагаю, что нет каких-то странных == vs .equals, как в Java).

Двойное редактирование: Подождите, нет [shape isEqualToString: @ "Circle"] .... почему мне не нужно было использовать его раньше, меня смущает, но добавление его здесь помогает.

6
задан Jenny 22 February 2012 в 19:27
поделиться