将NSDictionary保存到文件是否有任何限制

时间:2013-12-23 11:33:00

标签: ios objective-c nsdictionary

我想使用以下方法保存NSDictionary

+ (void)writeDicToFile:(NSDictionary *)dic fileName:(NSString *)fileName
{
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
[dic writeToFile:filePath atomically:YES];
}

但是对于某些字典它可以工作,对于一些复杂的字典它不起作用。

帮帮我!

2 个答案:

答案 0 :(得分:2)

为了成功保存NSDictionary,它所拥有的所有对象都必须符合NSCoding protocol

简而言之,这意味着您必须实施

- (void)encodeWithCoder:(NSCoder *)encoder

- (id)initWithCoder:(NSCoder *)decoder

用于所有自定义类。

这里有一个很好的教程:http://www.raywenderlich.com/1914/nscoding-tutorial-for-ios-how-to-save-your-app-data

修改

一旦您编写了NSCoder方法,就可以保存这样的数据:

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:self];
[archiver finishEncoding];
[data writeToFile:file atomically:YES];

从文件中初始化对象:

NSData *data = [[NSData alloc] initWithContentsOfFile:file];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
self = [unarchiver decodeObject];
[unarchiver finishDecoding];

你确实提到了json对象的问题:关于json对象的问题是首先你必须检查它的类型:它可以是NSDictionaryNSArray - 取决于输入和格式

当您获得只包含一个元素的数组时,常见问题就会出现 - 您正在寻找的字典。如果您的字典{...} json表示嵌入在[]中,则会发生这种情况。

答案 1 :(得分:0)

文档说:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag
  

此方法以递归方式验证所有包含的对象是否为   属性列表对象(NSData,NSDate,NSNumber,   NSString,NSArray或NSDictionary)在写出文件之前,和   如果所有对象都不是属性列表对象,则返回NO,因为   结果文件不是有效的属性列表。

你在自己的词典中使用了什么对象?
将属性列表对象放在字典中,然后没有理由它不起作用。

您还应该看到该方法的返回值。 (是或否)。