在我的应用程序中,当用户关闭应用程序(即它进入后台)时,我将数据与服务器同步。这个过程大约需要一分钟,涉及到对服务器上传数据的各种调用,因此我选择将其作为后台线程执行。
- (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中只是取消操作。
关于objective-c - 当应用程序进入前台时取消后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12882690/