Ios 在应用程序启动时打开大的子文件强制长启动时间

Ios 在应用程序启动时打开大的子文件强制长启动时间,ios,json,xcode,Ios,Json,Xcode,我正在创建一个由不同的游戏板组成的游戏,这些游戏板存储为字典、数组和json文件。json文件相当大,数组中有3000多个对象,大小约为23mb。我现在加载此文件的方式是在appDelegate实现文件中的didFinishLaunchingWithOptions,如下所示: NSString * filePath =[[NSBundle mainBundle] pathForResource:@"words" ofType:@"json"]; NSError * error; NSStrin

我正在创建一个由不同的游戏板组成的游戏,这些游戏板存储为字典、数组和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;
它工作得很好,除了在iPhone4设备上加载应用程序需要超过15秒,这太长了,而且我知道加载时间这么长,应用程序可能会被拒绝

有人能建议一个更好的方法吗


谢谢

使用loader设置输入屏幕为用户创建一个有趣的loader。。。并在此屏幕上加载数据。游戏结束后,启动游戏…

使用加载程序设置一个输入屏幕,为用户创建一个有趣的加载程序。。。并在此屏幕上加载数据。完成后,启动游戏…

使用核心数据之类的东西。它是为存储这样的信息而设计的


另外,不要把它放在应用程序代理中!应用程序代理用于响应应用程序事件。它不是应用程序需要的所有数据的转储。

使用核心数据之类的数据。它是为存储这样的信息而设计的


另外,不要把它放在应用程序代理中!应用程序代理用于响应应用程序事件。它并不是你的应用程序需要的所有数据的转储。

正如Yedidya所建议的,你可能想展示一些有趣的东西来让用户参与进来

除此之外,最重要的是:

保持用户界面的响应性 在后台线程上加载文件/网络资源。有大量代码示例显示了相同的情况。使用performselectorOnBackground或dispatch_asyncsome_global_队列之一执行后台任务。 完成后,使用performselectorOnMainThread或dispatch\u asynchdispatch\u get\u main\u队列返回主屏幕/游戏UI。
正如Yedidya所建议的,您可能希望展示一些有趣的东西,以保持用户的参与

除此之外,最重要的是:

保持用户界面的响应性 在后台线程上加载文件/网络资源。有大量代码示例显示了相同的情况。使用performselectorOnBackground或dispatch_asyncsome_global_队列之一执行后台任务。 完成后,使用performselectorOnMainThread或dispatch\u asynchdispatch\u get\u main\u队列返回主屏幕/游戏UI。
苹果有许多指南可以帮助您:

适用于Mac,但应适用于iOS。 已弃用,但可能仍有一些有用的提示。 一般来说,性能是应用程序设计的产物,因此为了提高性能,您可能必须重新设计应用程序的大部分

我将遵循以下步骤:

在中测量CPU使用率和磁盘访问。 不在主线程上加载和解析如此大的文件。 尽可能多地分割文件。 如果应用程序中未发生任何事件,请预加载资源。
苹果有许多指南可以帮助您:

适用于Mac,但应适用于iOS。 已弃用,但可能仍有一些有用的提示。 一般来说,性能是应用程序设计的产物,因此为了提高性能,您可能必须重新设计应用程序的大部分

我将遵循以下步骤:

在中测量CPU使用率和磁盘访问。 不在主线程上加载和解析如此大的文件。 尽可能多地分割文件。 如果应用程序中未发生任何事件,请预加载资源。
正如Yedidya所建议的,您可能希望展示一些有趣的东西,以保持用户的参与

除此之外,最重要的是:

保持用户界面的响应性 在后台线程上加载文件/网络资源。有大量代码示例显示了相同的情况。使用performselectorOnBackground或dispatch_asyncsome_global_队列之一执行后台任务。 完成后,使用performselectorOnMainThread或dispatch\u asynchdispatch\u get\u main\u队列返回主屏幕/游戏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
    });

正如Yedidya所建议的,您可能希望展示一些有趣的东西,以保持用户的参与

除此之外,最重要的是:

保持用户界面的响应性 在后台线程上加载文件/网络资源。有大量代码示例显示了相同的情况。使用performselectorOnBackground或dispatch_asyncsome_global_队列之一执行后台任务。 完成后,使用performselectorOnMainThread或dispatch\u asynchdispatch\u get\u main\u队列返回主屏幕/游戏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
    });

应用程序仍在加载15秒以上的事实是否仍然会影响我获得批准的机会?嗨,如果应用程序没有在足够短的时间内加载,应用程序将拒绝或崩溃。-。如果您将在s的新屏幕上加载数据,这应该不是问题。即使如此,如果您在长时间加载时只显示静态屏幕
g、 苹果可能会因为用户体验问题而拒绝它…应用程序仍在加载15秒以上这一事实是否会影响我获得批准的机会?嗨,如果应用程序没有在足够短的时间内加载,应用程序将拒绝或崩溃。-。如果您将在s的新屏幕上加载数据,这应该不是问题。尽管如此,如果你在长时间加载时只显示静态屏幕,苹果可能会因为用户体验问题而拒绝它……使用看起来像飞溅屏幕或加载屏幕的中间屏幕,并在那里完成工作。对于任何主要任务,您都应该避免didFinishLaunchingWithOptions。您应该在后台线程中使用GCD或NSOperation执行长任务,以免阻塞UI线程。谷歌iOS导入大数据集。还要查看核心数据,以避免在每次应用程序启动时导入数据。将各个游戏板放在单独的文件中。JSON也不是很好的存储格式,它实际上是一种传输格式。使用看起来像启动屏幕或加载屏幕的中间屏幕,在那里完成工作。对于任何主要任务,您都应该避免didFinishLaunchingWithOptions。您应该在后台线程中使用GCD或NSOperation执行长任务,以免阻塞UI线程。谷歌iOS导入大数据集。还要查看核心数据,以避免在每次应用程序启动时导入数据。将各个游戏板放在单独的文件中。JSON也不是很好的存储格式,它实际上是一种传输格式。很好,我试图在appDelegate之外加载文件,但ui会冻结,因此,如果首先将其添加到代理中,我会选择简单的选项,我现在就来试试苹果推荐的方法是不要在didfinishlaunching中做任何繁重的事情。您只需要将内容生成到全局队列,然后在主队列上加载UI和数据。同时,显示空视图控制器没有问题-使用您首选的忙碌光标或动画。你可以在start BUSY CURSOR区域启动所有这些。太好了,我试图在appDelegate外部加载文件,但ui会冻结,因此,如果首先将其添加到代理中,我会选择简单的选项,我现在就开始。苹果推荐的方法是不要在didfinishlaunching内部执行任何繁重的操作。您只需要将内容生成到全局队列,然后在主队列上加载UI和数据。同时,显示空视图控制器没有问题-使用您首选的忙碌光标或动画。您可以在“开始忙碌”光标区域启动所有这些。