在iOS中进入后台时执行清理任务

时间:2013-08-10 10:32:31

标签: ios ipad grand-central-dispatch uiapplication dispatch-async

我必须在应用程序进入后台时执行长时间运行的清理操作。由于清理操作是一个网络事务,并且将花费超过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。

1 个答案:

答案 0 :(得分:0)

您在beginBackgroundTaskWithExpirationHandler之后编写的代码将无法执行,因为它是异步执行的。声明为后台任务的任务需要是同步的,以便按照您期望的方式执行。