应用特定信息: com.oneorangetree.iphoneexample 未能及时启动 经过的总 CPU 时间(秒):3.500(用户 1.680,系统 1.820),17% CPU 已用应用程序 CPU 时间(秒):0.920,5% CPU
当应用程序加载时,它会在 viewDidLoad 中做很多事情,大约需要 30 秒才能完成。如何将它放在后台线程或其他东西中以加快应用程序并防止崩溃(因为加载时间过长)
应用特定信息: com.oneorangetree.iphoneexample 未能及时启动 经过的总 CPU 时间(秒):3.500(用户 1.680,系统 1.820),17% CPU 已用应用程序 CPU 时间(秒):0.920,5% CPU
当应用程序加载时,它会在 viewDidLoad 中做很多事情,大约需要 30 秒才能完成。如何将它放在后台线程或其他东西中以加快应用程序并防止崩溃(因为加载时间过长)
是的,您可以使用后台线程,但是更好的方法是在可能的情况下预先计算(或缓存)事物,这样加载时间就不会那么长。你的代码在做什么需要这么长时间才能运行?
我过去曾使用NSOperation
/NSOperationQueue
进行简单的线程化。具体来说,NSInvocationOperation
它使旋转需要一段时间的方法调用变得非常容易,并且NSOperationQueue
实际上为您线程化了它。您生成的方法必须是线程安全的,但这并不是特别难做到。例如,您可以NSOperationQueue
在您的-init
or-viewDidLoad
方法中创建一个,然后将其添加NSInvocationOperation
到队列中并按原样发送。
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *lengthyTask = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processAddresses) object:nil];
[opQueue addOperation:lengthyTask];
[lengthyTask release];
其中一件很酷的事情(尤其是在桌面上)是在 10.6(和 iOS 4)上自动使用 Grand Central Dispatch。
虽然线程化一个冗长的任务应该使您的应用程序响应更快(特别是如果您观察结果并在它们从线程化任务进来时显示它们,可能使用 KVO),实现一些缓存将是有益的。每次启动都重新加载通讯录会非常昂贵,尤其是大多数人不会经常更改通讯录。您可以将计算数据存储在本地文件或数据库中(Core Data 不太难使用,如果太慢可以直接使用 SQLite)。然后在启动时,您可以浏览地址簿,比较自上次运行应用程序以来每条记录的修改日期,并对新修改的记录进行地理编码。