【发布时间】:2010-06-25 04:08:28
【问题描述】:
当应用加载时,它会在 viewDidLoad 中做很多事情 大约需要 30 秒才能完成。如何将它放在后台线程或其他东西中以加快应用程序并防止崩溃(因为加载时间过长)
【问题讨论】:
标签: optimization iphone-sdk-3.0 ipad uikit viewdidload
当应用加载时,它会在 viewDidLoad 中做很多事情 大约需要 30 秒才能完成。如何将它放在后台线程或其他东西中以加快应用程序并防止崩溃(因为加载时间过长)
【问题讨论】:
标签: optimization iphone-sdk-3.0 ipad uikit viewdidload
我过去曾使用NSOperation/NSOperationQueue 进行简单的线程化。具体来说,NSInvocationOperation 使旋转需要一段时间的方法调用变得非常容易,NSOperationQueue 实际上为您处理了它。您生成的方法必须是线程安全的,但这并不是特别难做到。例如,您可以在-init 或-viewDidLoad 方法中创建NSOperationQueue,然后将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)。然后在启动时,您可以浏览地址簿,比较自上次运行应用以来每条记录的修改日期,对新修改的记录进行地理编码。
是的,您可以使用后台线程,但是更好的方法是在可能的情况下预先计算(或缓存)事物,这样加载时间就不会那么长。 你的代码在做什么需要这么长时间才能运行?
【讨论】: