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

Ошибка NSArray writeToFile

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

Здесь я сохраняю файл: (см. следующий вывод отладчика ниже)

// When built parse through dictionary and save to file
    for ( NSString *keys in [dicByCountry allKeys] )
    {
        NSArray *arrr = [[NSArray alloc] initWithArray:[dicByCountry objectForKey:keys]];
        NSString *fname = [self filePath:[NSString stringWithFormat:@"regions.cid%@.plist",keys]];
        if (![arrr writeToFile:fname atomically:YES])
            NSLog(@"Could not write file regions.cid%@.plist",keys);
    }

Здесь вывод GDB

(gdb) po fname
/Users/chris/Library/Application Support/iPhone Simulator/4.0/Applications/44A9FF9E-5715-4BF0-9BE2-525883281420/Documents/regions.cid0.plist


(gdb) po arrr
<__NSArrayI 0x8022b30>(
{
    countryID = "<null>";
    region = "?\U00e2vora";
    regionID = 16;
},
{
    countryID = "<null>";
    region = Vicenza;
    regionID = 14;
},
{
    countryID = "<null>";
    region = Wales;
    regionID = 23;
}
)
4b9b3361

Ответ 1

Если вы внимательно прочитаете документацию, writeToFile:atomically: ожидает, что массив будет содержать только объекты, которые могут быть записаны в файл plist.

Только объекты типа:

  • NSString
  • NSData
  • NSDate
  • NSNumber
  • NSArray
  • NSDictionary

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

Это несколько более ограничительный, чем обычно допустимый в NSArray s. В частности, значение [NSNull null] неприемлемо.

Ответ 2

Я конвертирую NSArray или NSDictionary в NSData перед сериализацией. Ниже приведена категория nsarray для сериализации и десериализации. Это удобно обрабатывает некоторые данные: nsnull

@implementation NSArray(Plist)

-(BOOL)writeToPlistFile:(NSString*)filename{
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self];
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES];
    return didWriteSuccessfull;
}

+(NSArray*)readFromPlistFile:(NSString*)filename{
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
    NSData * data = [NSData dataWithContentsOfFile:path];
    return  [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

@end //needs to be set for implementation