0

当应用程序进入后台时,我必须执行长时间运行的清理操作。由于清理操作是一个网络事务,需要 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 中加载了登录 ViewController。

4

1 回答 1

0

您之后编写的代码beginBackgroundTaskWithExpirationHandler将没有机会执行,因为它是异步执行的。声明为后台任务的任务需要同步才能按照您期望的方式执行。

于 2013-08-10T10:36:47.323 回答