是否有保存NSDictionary文件的限制
我想用下面的方法来保存NSDictionary
+ (void)writeDicToFile:(NSDictionary *)dic fileName:(NSString *)fileName { NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName]; [dic writeToFile:filePath atomically:YES]; }
但是,对于一些字典,它的工作原理和一些复杂的字典是行不通的。
帮我!
为了使NSDictionary
成功保存,它所有的对象必须符合NSCoding协议 。
总之这意味着你必须执行
- (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对象的事情是,首先你必须检查它的types:它可以是一个NSDictionary
或一个NSArray
– 取决于input和格式。
当只有一个元素的数组 – 你正在寻找的字典时遇到常见的问题。 如果您的字典{...}
json表示被embedded在[]
就会发生这种情况。
该文件说:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag
在写出文件之前,此方法recursion地validation所有包含的对象是属性列表对象(NSData,NSDate,NSNumber,NSString,NSArray或NSDictionary的实例),如果所有对象不是属性列表对象,则返回NO生成的文件不会是有效的属性列表。
你在你的字典里放了什么东西?
把属性列表对象放在你的字典中,那么没有理由不起作用。
你也应该看到方法的返回值。 ( 是或否)。