Ошибка 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;
}
)
Ответы
Ответ 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