Obj-C,未能及时发布,进行一些需要20秒的DB处理,建议?

时间:2012-02-20 13:30:42

标签: iphone objective-c ios cocoa-touch

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秒才能完成。

虽然在这种情况下这是一次性的,如果用户暂时没有使用该应用,用户可能会遇到这种情况。

通常情况下,这个过程不会花费太长时间,因为只需要处理一些事务。

我不确定如何处理,有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我建议你在后台进行数据库处理。也许您可以在后台线程中更新数据库时禁用接口或显示等待指示符。然后,一旦完成,您可以启用界面或隐藏指示器。

有不同的方法来创建后台线程。

  • 使用NSThread class
  • 手动创建一个主题
  • 使用NSOperationNSOperationQueue
  • 使用Grand Central Dispatch(GCD)

希望它有所帮助。

修改

这里是您目标的简单代码(遵循@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)

我会(并且在过去的几个应用程序中)在后台线程上执行数据库更新,并在更新完成时向用户显示“请稍候”屏幕。