【发布时间】:2013-04-22 05:27:21
【问题描述】:
我已经为此苦苦挣扎了很久,我真的需要一些好的帮助。 :)
我有一个应用程序,我将一个相当大的 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?
如果你也有一些代码示例,那会让我很高兴。
这是在应用程序准备好进入应用程序商店之前我需要修复的最后一件事,它简直要了我的命!我无法解决这个问题。
【问题讨论】:
-
安静对你来说最重要的是什么? 5KB? 10MB? 1GB?
-
你有没有考虑过在你的代码上运行Xcode instruments?我在解析中看到肯定会大大减慢速度的东西(例如同步的“
NSData dataWithContentsOfURL”调用)。 -
@MichaelDautermann 我可以用什么来代替 NSData?
-
如果你想保存一个大的(至少 10s 的 kbytes)JSON 字符串,那么最简单/最快的方法就是作为一个平面文件。如果你想保存解析后的 JSON 片段,那么 Core Data 或你自己的 SQLite DB。
-
虽然 SBJson 解析速度很慢,但 15 秒是不正常的。这将对应于大约 20 MByte(iPad 2 速度)的 JSON。使用 NSJSONSerialization 您的 100kB UTF-8 数据应该在 12 毫秒内解码。但是,for 循环中的代码(您在其中创建图像)应该在辅助线程或调度队列上进行处理。注意:从 iOS 4.0 开始,许多关于图像和绘图上下文的方法都变成了线程安全的。此外,您的图片 URL 肯定是文件 URL,不是吗?
标签: objective-c json core-data nsfilemanager sbjson