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
当应用加载时,它会在viewDidLoad中执行大量操作 完成大约需要30秒。我如何将它放在后台线程或其他东西来加速应用程序并防止崩溃(因为加载时间太长)
答案 0 :(得分:1)
是的,您可以使用后台线程,但更好的方法是在可能的情况下预先计算(或缓存)内容,以便加载时间不会太长。 你的代码做了什么样的事情需要很长时间才能运行?
答案 1 :(得分:1)
我过去曾使用NSOperation
/ NSOperationQueue
进行简单线程化。具体来说,NSInvocationOperation
使得旋转一段时间关闭的方法调用变得非常容易,NSOperationQueue
实际上为您提供了线程。您正在产生的方法必须是线程安全的,但这并不是特别难。例如,您可以在NSOperationQueue
或-init
方法中创建-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)。然后在启动时,您可以浏览地址簿,比较上次运行应用程序时每条记录的修改日期,对新修改的记录进行地理编码。