2

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

- (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;
    }
}

但它不会停止同步 - 只会继续进行。几乎就像一旦开始,它就会继续前进。

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

还是我只是做错了什么?

任何建议,非常感谢。

4

1 回答 1

4

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

于 2012-10-14T13:44:21.337 回答