在应用程序启动时打开较大的子文件,导致启动时间较长



我正在创建一个由不同的游戏板组成的游戏,这些游戏板存储为字典,数组,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响应性
  • 在后台线程加载文件/网络资源。有大量的代码示例显示了相同的内容。使用performselectorOnBackgrounddispatch_async(some_global_queue)中的一个执行后台任务。
  • 一旦完成,回到主屏幕/游戏UI使用performselectorOnMainThreaddispatch_asynch(dispatch_get_main_queue)

正如Yedidya所建议的,你可能想要展示一些有趣的东西来吸引用户。

除此之外,最重要的是:

  • 保持你的UI响应性
  • 在后台线程加载文件/网络资源。有大量的代码示例显示了相同的内容。使用performselectorOnBackgrounddispatch_async(some_global_queue)中的一个执行后台任务。
  • 完成后,使用performselectorOnMainThreaddispatch_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。
  • 性能概述指南
  • 启动时间性能指南已弃用,但可能仍然有一些有用的提示。

一般来说,性能是应用程序设计的产物,所以为了提高性能,你可能不得不重新设计应用程序的大部分内容。

我将遵循以下步骤:

  1. 在Instruments用户指南中测量CPU使用率和磁盘访问。
  2. 不在主线程上加载和解析这么大的文件。
  3. 如果应用程序中没有发生任何事情,则预加载资源。

最新更新