0
应用特定信息:
com.oneorangetree.iphoneexample 未能及时启动
经过的总 CPU 时间(秒):3.500(用户 1.680,系统 1.820),17% CPU
已用应用程序 CPU 时间(秒):0.920,5% CPU

当应用程序加载时,它会在 viewDidLoad 中做很多事情,大约需要 30 秒才能完成。如何将它放在后台线程或其他东西中以加快应用程序并防止崩溃(因为加载时间过长)

4

2 回答 2

1

是的,您可以使用后台线程,但是更好的方法是在可能的情况下预先计算(或缓存)事物,这样加载时间就不会那么长。你的代码在做什么需要这么长时间才能运行?

于 2010-06-25T04:11:12.117 回答
1

我过去曾使用NSOperation/NSOperationQueue进行简单的线程化。具体来说,NSInvocationOperation它使旋转需要一段时间的方法调用变得非常容易,并且NSOperationQueue实际上为您线程化了它。您生成的方法必须是线程安全的,但这并不是特别难做到。例如,您可以NSOperationQueue在您的-initor-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)。然后在启动时,您可以浏览地址簿,比较自上次运行应用程序以来每条记录的修改日期,并对新修改的记录进行地理编码。

于 2010-06-25T04:47:56.257 回答