2011-04-18 70 views
1

我使用SBJsonParser解析来自服务器的大型json响应I查询。我希望使用时间戳方法来了解何时需要重新获取并重新解析所有数据,所以我想知道如何在不需要的时候保存数据请求大的JSON包来刷新我的数据。在iOS中保存JSON对象

我想我应该使用NSCoding协议和归档大致如下所示:

// alloc nsdata obj 
NSMutableData *data = [[[NSMutableData alloc] init] autorelease]; 

// create archiver 
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease]; 

// archive whiteboard 
[archiver encodeObject:mSaveData forKey:@"Data"]; 
[archiver finishEncoding]; 
[data writeToFile:dataPath atomically:YES]; 

但有一个简单的方法来编码这个JSON对象,它是真正NSDictionaries的一个NSArray,或做我必须精心编码这个对象内的每个字段?

也许有一个更简单的方法,比如将json对象本身保存为一个字符串(在用objectWithData方法分析之前),并在每次应用程序加载并想要使用本地副本时重新解析它?

回答

2

由于您要保存的数据只是NSArrays,NSDictionaries,可能是像NSStrings和NSNumbers这样的东西,我不明白为什么您需要“精心编码每个字段”。你用NSKeyedArchiver做的方式是有效的,你不需要任何进一步的代码来保存。其他选项:

  • 使用+[NSKeyedArchiver archiveRootObject:toFile:]
  • 使用SBJSON将数据转回JSON并将JSON字符串存储为UTF-8数据。
  • 使用+[NSPropertyListSerialization dataFromPropertyList:format:errorDescription:]另存为plist。
+0

谢谢,但我的理解是,被编码的对象必须实现NSCoding协议,然后实质上调用encode___方法(在encodeWithCoder:方法中)为每个保存的数据片段。你是说我可以简单地使用encodeObject:forKey:方法并传递NSArray,或者将archiveArray:toFile:方法中的NSArray作为根对象传递(不需要遍历每个字段),它将只保存所有数据即使它是一个字典和数组的嵌套数组等? – Joey 2011-04-18 19:50:35

+0

通过NSArray作为根对象,你应该很好去。当你解码它时,你会返回数组作为根对象。 – 2011-04-18 19:52:35

+0

好的。这是因为NSArray对象本地实现了根据需要的nscoding协议? – Joey 2011-04-18 19:55:01

0

AsiHTTP允许您缓存您的请求。它实现你需要的功能