Application Specific Information:
com.my-app failed to launch in time
Elapsed total CPU time (seconds): 20.090 (user 20.090, system 0.000), 100% CPU
Elapsed application CPU time (seconds): 17.598, 87% CPU
我对我的应用程序进行了修改,因此我现在从applicationDidFinishLaunching运行一个函数,它将执行一些数据库处理。
我基本上是在创建一些新记录并更新现有记录。
对于我现有的一位测试人员/真实客户,这需要20秒才能完成。
虽然在这种情况下这是一次性的,如果用户暂时没有使用该应用,用户可能会遇到这种情况。
通常情况下,这个过程不会花费太长时间,因为只需要处理一些事务。
我不确定如何处理,有什么建议吗?
答案 0 :(得分:2)
我建议你在后台进行数据库处理。也许您可以在后台线程中更新数据库时禁用接口或显示等待指示符。然后,一旦完成,您可以启用界面或隐藏指示器。
有不同的方法来创建后台线程。
NSThread
class NSOperation
和NSOperationQueue
类希望它有所帮助。
修改强>
这里是您目标的简单代码(遵循@JeremyP建议)。
首先,创建一个NSOperation
子类
// .h
@interface YourOperation : NSOperation
{
}
//.m
@implementation YourOperation
// override main, note that init is executed in the same thread where you alloc-init this instance
- (void)main
{
// sorround the thread with a pool
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// do your stuff here..
// you could send a notification when you have finished to import your db,
// the notification is sent in a background thread,
// so in the place where you listen it, if you need to update the interface,
// you need to do it in the main thread (e.g. performSelectorOnMainThread)
[[NSNotificationCenter defaultCenter] postNotificationName:kImportComplete object:self];
[pool drain];
pool = nil;
}
然后,在您的应用程序委托中,例如调用[self import];
,可以定义如下:
if (!(self.operationQueue)) {
NSOperationQueue* q = [[NSOperationQueue alloc] init];
[q setMaxConcurrentOperationCount:1];
self.operationQueue = q;
[q release];
YourOperation *op = [[YourOperation alloc] init];
[self.operationQueue addOperation:op];
[op release], op = nil;
}
答案 1 :(得分:0)
我会(并且在过去的几个应用程序中)在后台线程上执行数据库更新,并在更新完成时向用户显示“请稍候”屏幕。