Как читать и писать в NSArray, чтобы составить список? - PullRequest
1 голос
/ 20 декабря 2011

У меня несколько проблем, связанных с чтением и записью NSArray в и из списка.

Я создал файл plist в папке «Supporting Files», который хочу использовать для инициализацииданные приложения с первой загрузкой.

Вот как выглядит мой plist:

enter image description here

Затем я использую этот код, чтобы попытаться загрузить plist вapp:

    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    filePath = [documentsDirectory stringByAppendingPathComponent:kDataFile];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:filePath])
    {
        NSString *bundle = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
        [fileManager copyItemAtPath:bundle toPath:filePath error:&error];
    }

Затем я пытаюсь загрузить данные из файла plist следующим образом, но, похоже, ничего не отображается.

NSMutableDictionary *savedData = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
NSMutableArray *myNSArray = [[savedData objectForKey:@"KEY_Level_1"] mutableCopy];
savedData = nil;

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

ПРИМЕЧАНИЕ: My NSArray будет содержать целую кучу NSDictionaries.

1 Ответ

0 голосов
/ 20 декабря 2011
  1. Вам необходимо проверить возвращаемое значение copyItemAtPath:toPath:error: и, по крайней мере, зарегистрировать ошибку, если метод возвращает false:

    if (![fileManager copyItemAtPath:bundle toPath:filePath error:&error]) {
        NSLog(@"error: copyItemAtPath:%@ toPath:%@ error:%@", bundle, filePath, error);
        return;
    }
    
  2. -[NSDictionary initWithContentsOfFile:]не имеет возможности сообщать об ошибках, поэтому, если это не удается, вы не можете легко понять, почему.Попробуйте прочитать файл в NSData и использовать -[NSPropertyListSerialization propertyListWithData:options:format:error:] для его анализа:

    NSData *data = [NSData dataWithContentsOfFile:filePath options:0 error:&error];
    if (!data) {
        NSLog(@"error: could not read %@: %@", filePath, error);
        return;
    }
    NSMutableDictionary *savedData = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:NULL error:&error];
    if (!savedData) {
        NSLog(@"error: could not parse %@: %@", filePath, error);
        return;
    }
    NSMutableArray *myNSArray = [savedData objectForKey:@"KEY_Level_1"];
    savedData = nil;
    if (!myNSArray) {
        NSLog(@"error: %@: object for KEY_Level_1 missing", filePath);
        return;
    }
    

Если вы сделаете это, вы сможете легче понять, почему ваши данныене загружается.

ОБНОВЛЕНИЕ

При дальнейшей проверке похоже, что словарь верхнего уровня в вашем списке содержит ключ "Root".Значением для «Root» является словарь, содержащий ключ «KEY_Level_1».Так что вам нужно сделать это:

NSMutableArray *myNSArray = [[savedData objectForKey:@"Root"] objectForKey:@"KEY_Level_1"];
...