gpt4 book ai didi

iphone - Obj-C,未能及时启动,正在做一些需要 20 秒的数据库处理,建议?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:22 27 4
gpt4 key购买 nike

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 运行一个函数,该函数将执行一些数据库处理。

我基本上是在创建一些新记录并更新一些现有记录。

对于我现有的一位 Beta 测试人员/真实客户,这需要 20 秒才能完成。

虽然在这种情况下这是一次性的,但如果用户有一段时间没有使用该应用程序,他们可能会遇到这种情况。

通常这个过程不会花费很长时间,因为只有少数交易要处理。

我不确定如何进行,有什么建议吗?

最佳答案

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

创建后台线程有多种方式。

  • 使用 NSThread 类手动创建线程
  • 使用 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;
}

然后,在您的应用程序委托(delegate)中调用 [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;
}

关于iphone - Obj-C,未能及时启动,正在做一些需要 20 秒的数据库处理,建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9361959/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com