在我的应用程序中,当用户关闭应用程序(即它进入后台)时,我正在将我的数据与服务器同步。这个过程大约需要一分钟,并且涉及对服务器的各种调用以上传数据,因此我选择将其作为后台线程执行。
- (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;
}
}
但它不会停止同步 - 只会继续进行。几乎就像一旦开始,它就会继续前进。
我怀疑这可能是因为控制同步的对象是一个单例 - 即不是一个可以被破坏的类对象,它是一个单例,因此可能因为这个原因而保持活力。这会有所作为吗?
还是我只是做错了什么?
任何建议,非常感谢。