我正在创建一个由不同的游戏板组成的游戏,这些游戏板存储为字典,数组,json文件。json文件非常大,数组中有3000多个对象,大约有23mb大小。我现在加载这个文件的方式是在appDelegate实现文件中的didFinishLaunchingWithOptions中,如下所示:
NSString * filePath =[[NSBundle mainBundle] pathForResource:@"words" ofType:@"json"];
NSError * error;
NSString* fileContents =[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
if(error)
{
NSLog(@"Error reading file: %@",error.localizedDescription);
}
NSDictionary *data = (NSDictionary *)[NSJSONSerialization
JSONObjectWithData:[fileContents dataUsingEncoding:NSUTF8StringEncoding]
options:0 error:NULL];
wordsArray = [[NSMutableArray alloc]initWithArray:[data objectForKey:@"results"]];
然后我可以通过调用
从应用程序中的任何地方检索数组NSArray *wordsArray = appDelegate.wordsArray;
它工作得很好,除了这个应用程序需要超过15秒才能在iPhone 4设备上加载,这太长了,我理解一个应用程序可能会因为加载时间这么长而被拒绝。
谁能建议一个更好的方法来解决这个问题,
谢谢
使用core data之类的东西。它被设计用来存储这样的信息。
同样,不要把它放在应用委托中!app委托是用来响应app事件的。它不是应用程序所需的所有数据的转储
设置一个带有加载器的输入屏幕(为用户做一个有趣的加载器…)并在该屏幕加载数据。当它完成后,启动你的游戏…
正如Yedidya所建议的,你可能想要展示一些有趣的东西来吸引用户。
除此之外,最重要的是:
- 保持你的UI响应性
- 在后台线程加载文件/网络资源。有大量的代码示例显示了相同的内容。使用
performselectorOnBackground
或dispatch_async(some_global_queue)
中的一个执行后台任务。 - 一旦完成,回到主屏幕/游戏UI使用
performselectorOnMainThread
或dispatch_asynch(dispatch_get_main_queue)
。
正如Yedidya所建议的,你可能想要展示一些有趣的东西来吸引用户。
除此之外,最重要的是:
- 保持你的UI响应性
- 在后台线程加载文件/网络资源。有大量的代码示例显示了相同的内容。使用
performselectorOnBackground
或dispatch_async(some_global_queue)
中的一个执行后台任务。 - 完成后,使用
performselectorOnMainThread
或dispatch_asynch(dispatch_get_main_queue)
返回主屏幕/游戏UI。
要点如下:
//START BUSY CURSOR HERE
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
// Read JSON file here
dispatch_async(dispatch_get_main_queue(),
^{
//STOP BUSY CURSOR
//PERFORM UI UPDATE HERE
});
苹果有很多指南可以帮助你:
- Mac的性能和响应性调整,但应该适用于iOS。
- 性能概述指南
- 启动时间性能指南已弃用,但可能仍然有一些有用的提示。
一般来说,性能是应用程序设计的产物,所以为了提高性能,你可能不得不重新设计应用程序的大部分内容。
我将遵循以下步骤:
- 在Instruments用户指南中测量CPU使用率和磁盘访问。
- 不在主线程上加载和解析这么大的文件。
- 如果应用程序中没有发生任何事情,则预加载资源。