Optimization 如何在iPad上加速我的应用程序? 特定于应用程序的信息: com.oneorangetree.iphoneexample未能及时启动 已用CPU总时间(秒):3.500(用户1.680,系统1.820),17%CPU 已用应用程序CPU时间(秒):0.920,5%CPU

Optimization 如何在iPad上加速我的应用程序? 特定于应用程序的信息: com.oneorangetree.iphoneexample未能及时启动 已用CPU总时间(秒):3.500(用户1.680,系统1.820),17%CPU 已用应用程序CPU时间(秒):0.920,5%CPU,optimization,iphone-sdk-3.0,ipad,uikit,viewdidload,Optimization,Iphone Sdk 3.0,Ipad,Uikit,Viewdidload,当应用程序加载时,它会在viewDidLoad中执行很多操作 大约需要30秒才能完成。如何将其放入后台线程或其他程序中以加速应用程序并防止崩溃(因为加载时间太长)是的,您可以使用后台线程,但是更好的方法是尽可能预先计算(或缓存)内容,以便加载时间不会太长。 您的代码执行的是哪种操作需要这么长时间才能运行?我过去曾使用NSOperation/NSOperationQueue进行简单线程处理。具体地说,NSInvocationOperation可以非常轻松地旋转一个需要一段时间的方法调用,NSOpe

当应用程序加载时,它会在viewDidLoad中执行很多操作
大约需要30秒才能完成。如何将其放入后台线程或其他程序中以加速应用程序并防止崩溃(因为加载时间太长)

是的,您可以使用后台线程,但是更好的方法是尽可能预先计算(或缓存)内容,以便加载时间不会太长。
您的代码执行的是哪种操作需要这么长时间才能运行?

我过去曾使用
NSOperation
/
NSOperationQueue
进行简单线程处理。具体地说,
NSInvocationOperation
可以非常轻松地旋转一个需要一段时间的方法调用,
NSOperationQueue
实际上可以为您执行线程。生成的方法必须是线程安全的,但这并不特别困难。例如,您可以在
-init
-viewDidLoad
方法中创建一个
NSOperationQueue
,然后将
NSInvocationOperation
添加到队列中,并按原样发送

Application Specific Information: com.oneorangetree.iphoneexample failed to launch in time elapsed total CPU time (seconds): 3.500 (user 1.680, system 1.820), 17% CPU elapsed application CPU time (seconds): 0.920, 5% CPU 其中一件很酷的事情(特别是在桌面上)是在10.6(和iOS 4)上自动使用Grand Central Dispatch


虽然线程化一个较长的任务会使你的应用程序更具响应性(特别是当你观察结果并在它们从线程化任务中进入时显示它们时,可能是使用KVO),但实现一些缓存将是有益的。每次发布时重新加载地址簿的成本都非常高,尤其是大多数人不会经常更改地址簿。您可以将计算出的数据存储在本地文件或数据库中(核心数据不太难使用,如果速度太慢,可以直接使用SQLite)。然后在启动时,你可以浏览地址簿,比较上一次运行应用程序时每条记录上的修改日期,对新修改的记录进行地理编码。

基本上,我会在你的联系人簿中使用谷歌地图和地理编码地址。如果你有很多联系人,那就要花很多时间。我有300多个,应用程序崩溃,因为它需要很长时间。正如paxswill在下面使用NSOperationQueue所说的,你应该能够很好地工作,而不会有太多麻烦。如果创建处理单个通讯簿条目查找的NSOperation子类,则为每个联系人创建实例NSOperationQueue将为您处理所有线程。作为额外的好处,如果(当)一台iDevice出现在场景中,并且有多个核心NSOperationQueue,那么您将能够利用它,而无需对代码进行任何更改:)谢谢。这确实使应用程序的加载速度大大加快,但有没有办法通知用户我们仍在加载数据,这样他/她就不会认为应用程序冻结了?我假设每个操作都是按顺序完成的,这样您就可以在返回每个记录时更新界面。实现这一点的两种方法是使用线程任务(有点像委托)的回调,该回调使用参数更新接口。另一种方法是在数据集合上实现。让一个对象观察集合并在更新到来时进行处理。除非完全如此,您可以尝试在屏幕上显示加载消息,类似于
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *lengthyTask = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processAddresses) object:nil];
[opQueue addOperation:lengthyTask];
[lengthyTask release];