我一直在努力解决这个问题,我真的需要一些很好的帮助。 :)
我有一个应用程序,我正在解析一个非常大的JSON到appdelegate的didFinishLaunchingWithOptions
。
我的模型对象是:
选项卡:
NSString *title
NSMutableArray *categories
类别:
NSString *title
NSMutableArray *items
项目
NSString *title
NSString *description
UIImage *image
我需要在本地保存数据,因为每次我的应用启动时解析大约需要15秒。我正在使用SBJSON框架。
这是我的解析代码:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"json_template" ofType:@"json"];
NSString *contents = [NSString stringWithContentsOfFile: filePath encoding: NSUTF8StringEncoding error: nil];
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSMutableDictionary *json = [jsonParser objectWithString: contents];
tabs = [[NSMutableArray alloc] init];
jsonParser = nil;
for (NSString *tab in json)
{
Tab *tabObj = [[Tab alloc] init];
tabObj.title = tab;
NSDictionary *categoryDict = [[json valueForKey: tabObj.title] objectAtIndex: 0];
for (NSString *key in categoryDict)
{
Category *catObj = [[Category alloc] init];
catObj.name = key;
NSArray *items = [categoryDict objectForKey:key];
for (NSDictionary *dict in items)
{
Item *item = [[Item alloc] init];
item.title = [dict objectForKey: @"title"];
item.desc = [dict objectForKey: @"description"];
item.url = [dict objectForKey: @"url"];
if([dict objectForKey: @"image"] != [NSNull null])
{
NSURL *imgUrl = [NSURL URLWithString: [dict objectForKey: @"image"]];
NSData *imageData = [NSData dataWithContentsOfURL: imgUrl];
item.image = [UIImage imageWithData: imageData];
}
else
{
UIImage *image = [UIImage imageNamed: @"standard.png"];
item.image = image;
}
[catObj.items addObject: item];
}
[tabObj.categories addObject: catObj];
}
[tabs addObject: tabObj];
}
这样做的最佳方式是什么?使用核心数据还是NSFileManager
?
如果你也有som代码示例,它会让我很开心。
这是我在应用程序准备好应用程序商店之前需要修复的最后一件事,它只会让我失望!我无法解决这个问题。
答案 0 :(得分:2)
如果您在iOS上工作,则将文件保存到Documents文件夹。在Mac OS X上,它将位于Application Support文件夹中。由于您使用的是iOS,请阅读this answer以了解如何访问Documents文件夹。
您要存储的所有对象都应实现NSCoding。以上变量已经做到了。如果您想直接存储选项卡,类别和项目,他们需要实现NSCoding。然后,您只需将它们序列化为文件即可。打开app时,您可以查找此文件并在不解析的情况下返回对象。
代码看起来像这样(为了简洁起见,未经测试和错误检查):
- (void) saveStateToDocumentNamed:(NSString*)docName
{
NSError *error;
NSFileManager *fileMan = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths[0] stringByAppendingPathComponent:docName];
if ([fileMan fileExistsAtPath:docPath])
[fileMan removeItemAtPath:docPath error:&error];
// Create the dictionary with all the stuff you want to store locally
NSDictionary *state = @{ ... };
// There are many ways to write the state to a file. This is the simplest
// but lacks error checking and recovery options.
[NSKeyedArchiver archiveRootObject:state toFile:docPath];
}
- (NSDictionary*) stateFromDocumentNamed:(NSString*)docName
{
NSError *error;
NSFileManager *fileMan = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths[0] stringByAppendingPathComponent:docName];
if ([fileMan fileExistsAtPath:docPath])
return [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
return nil;
}