- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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
类手动创建线程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;
}
然后,在您的应用程序委托(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/
我很快就会明白,我不是 Git 甚至 Gitkraken 的高手。因此,我只有一个修补程序、一个主分支和一个功能分支。我在修补程序、提交、推送和 merge 到 master 中进行更改(然后我也推送
我刚开始使用 stub 请求来测试对 iOS 的外部 API 的异步调用。我目前被以下代码困住了,我无法弄清楚什么不起作用。 我想要实现的非常简单的事情是,如果我从网站收到 200 响应,我将 Vie
设置: 一个 JPA ReviewRepository延长 CrudRepository 我的测试使用切片测试注释 @DataJpaTest 我的测试@Autowired ReviewReposito
我尝试通过logstash将csv文件vrom filebeat摄取到hdfs中。 Filebeat 成功将其转移到 logstash,因为我使用 stdout{codec=>rubydebug} 并
我看到很多教程解释了如何在 Tensorflow 的 Bazel WORKSPACE 中构建项目(例如 this one)。但我似乎无法找到一种方法来构建我自己的项目并将 tensorflow 作为依
我正在运行 Ubuntu 10.04 并且最初安装了 ruby 1.9.1(来自源代码)。我刚刚决定试用 ruby 1.9.2 和 rails 3,现在似乎是使用 rvm 处理多个 ruby
我有一个应用程序从后端接收支持的语言环境列表作为以下响应: {locales: [{code: 'enUS'}, {code: 'deDE'}, {code: 'arAR'}]} 我想使用 date-
我是一名优秀的程序员,十分优秀!