我的iOS应用程序中的多任务处理似乎有问题。 我有一个NSTimer运行,它会更新屏幕上的一些内容和另一个NSTimer,它将在定义的时间间隔后才会被触发一次。
问题是:我想对那场火灾事件做出反应。我的应用程序是否在前台。
我使用以下代码来跟踪计时器:
-(void)backgroundThreadStarted {
NSAutoreleasePool* thePool = [[NSAutoreleasePool alloc] init];
// create a scheduled timer
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(backgroundThreadFire:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
m_isBackgroundThreadToTerminate = NO;
// create the runloop
double resolution = 300.0;
BOOL isRunning;
do {
// run the loop!
NSDate* theNextDate = [NSDate dateWithTimeIntervalSinceNow:resolution];
isRunning = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:theNextDate];
// occasionally re-create the autorelease pool whilst program is running
[thePool release];
thePool = [[NSAutoreleasePool alloc] init];
} while(isRunning==YES && m_isBackgroundThreadToTerminate==NO);
[thePool release];
}
-(void)backgroundThreadFire:(id)sender {
// do repeated work every one second here
// when thread is to terminate, call [self backgroundThreadTerminate];
}
-(void)backgroundThreadTerminate {
m_isBackgroundThreadToTerminate = YES;
CFRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]);
}
(在此处找到:http://www.cocoadev.com/index.pl?RunLoop)
我在backgroundThreadStarted
上呼叫-(void)applicationDidEnterBackground:(UIApplication *)application
,在backgroundThreadTerminate
呼叫- (void)applicationWillEnterForeground:(UIApplication *)application
,我可以跟踪定时器。所以这很有效。
不幸的是,在返回应用程序后,整个屏幕都是黑色的。我尝试了不同的解决方案,我搜索了很多,但都没有用。
如果我在看到这个黑屏时最小化应用程序,我可以看到应用程序,同时它是动画到背景。
我错过了什么?
如果我不做这个backgroundThread的东西,屏幕显示正常。但是,我无法跟踪计时器。
提前致谢!
答案 0 :(得分:2)
你正在使用AppKit(OS X)的代码而不是UIKit(iOS)。
您应该查看后台API,它将涉及处理didEnterBackground,并在那里使用beginBackgroundTaskWithExpirationHandler创建后台任务:
后台线程不是必需的(它们适用于在应用程序后台运行的内容,而您的应用程序仍在运行)。后台任务是一种让应用程序不再位于前台时运行常规应用程序代码(无UI交互)的方法。在本地通知服务之外,您将无法轻松地与用户就此进行通信(API更多是为了让您在离开应用程序后完成上传)。并且你的任务仅限于在后备后十分钟。