我必须在应用程序进入后台时执行长时间运行的清理操作。由于清理操作是一个网络事务,并且将花费超过5秒,我使用beginBackgroundTaskWithExpirationHandler:API,一切都工作得非常好。
下面我要添加代码以便更清晰..
- (void)applicationDidEnterBackground:(UIApplication *)application {
@synchronized(self)
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
[self performCleanUpOperation];
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
}
- (void) performCleanUpOperation
{
// Cleanup Network Operation
[(NSObject *)self performSelectorOnMainThread:(@selector(cleanUpDidFinish)) withObject:nil waitUntilDone:NO];
}
- (void) cleanUpDidFinish
{
dispatch_async(dispatch_get_main_queue(), ^(void){
[self saveContext];
[(CustomUIApplication *)[UIApplication sharedApplication] logoutWithAlert:NO];
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
现在我遇到的问题是,当我将应用程序带到前台时,我看到应用程序在进入后台之前的旧屏幕。并立即从旧屏幕导航到登录屏幕。
知道为什么它在应用程序重新启动时没有显示登录屏幕,即使我已经在cleanUpDidFinish中加载了Login ViewController。
答案 0 :(得分:0)
您在beginBackgroundTaskWithExpirationHandler
之后编写的代码将无法执行,因为它是异步执行的。声明为后台任务的任务需要是同步的,以便按照您期望的方式执行。