繁体   English   中英

当应用程序进入前台时取消后台任务

[英]Cancel background task when app enters foreground

在我的应用程序中,当用户关闭应用程序(即它进入后台)时,我正在将数据与服务器同步。 此过程大约需要一分钟,并且涉及对服务器的各种调用以上载数据,因此我选择将其作为后台线程执行。

- (void)applicationDidEnterBackground:(UIApplication *)application {

    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [asynchronousAPIController processQueueOrWaitWithIsBackgroundSync:true];

        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

除非用户在此同步期间(即在第一分钟内)重新进入前景,否则此工作正常。 想要的是后台同步终止完成 - 即使它在同步的中途也停止同步。 当应用程序接下来进入后台时,它可以从头开始重启整个过程,没问题。

我试过用这个:

- (void)applicationWillEnterForeground:(UIApplication *)application {
    if (bgTask != UIBackgroundTaskInvalid) {
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }
}

但它并没有阻止同步 - 只是继续前进。 几乎就像它一旦开始它就继续前进。

我怀疑它可能是因为控制同步的对象是一个单例 - 也就是说它不是一个可以被破坏的类对象,而是一个单例,所以可能因此而保持活着。 这会有所作为吗?

或者我只是做错了什么?

任何建议,非常感谢。

您需要在NSOperation中完成后台工作。 我将创建一个NSBlockOperation并将其添加到NSOperationQueue。 这样就可以自动生成后台线程。 对于复杂的操作,创建一个NSOperation子类。 在NSOperation代码内部检查操作是否定期取消(例如在for循环内),如果是,则退出代码块(在for循环中: if ([operation isCanceled]) break; )。 在applicationWillEnterForeground中只需取消操作即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM