NSArray writeToFile завершается ошибкой - PullRequest
21 голосов
/ 10 июня 2010

Я пытаюсь сохранить массив, в котором есть несколько словарей, в файл 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;
}
)

Ответы [ 2 ]

36 голосов
/ 10 июня 2010

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

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

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

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

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

27 голосов
/ 26 апреля 2012

Я преобразовываю 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...