我想使用以下方法保存NSDictionary
+ (void)writeDicToFile:(NSDictionary *)dic fileName:(NSString *)fileName
{
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
[dic writeToFile:filePath atomically:YES];
}
但是对于某些字典它可以工作,对于一些复杂的字典它不起作用。
帮帮我!
答案 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对象的问题是首先你必须检查它的类型:它可以是NSDictionary
或NSArray
- 取决于输入和格式
当您获得只包含一个元素的数组时,常见问题就会出现 - 您正在寻找的字典。如果您的字典{...}
json表示嵌入在[]
中,则会发生这种情况。
答案 1 :(得分:0)
文档说:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag
此方法以递归方式验证所有包含的对象是否为 属性列表对象(NSData,NSDate,NSNumber, NSString,NSArray或NSDictionary)在写出文件之前,和 如果所有对象都不是属性列表对象,则返回NO,因为 结果文件不是有效的属性列表。
你在自己的词典中使用了什么对象?
将属性列表对象放在字典中,然后没有理由它不起作用。
您还应该看到该方法的返回值。 (是或否)。