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

标签 objective-c ios background

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

- (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/

相关文章:

android - 优化应用程序背景以改变方向?

HTML 背景附件属性在 IE8 中不起作用

android - 适合所有方向的设计布局

c# - 通过 MonoTouch 和 C# 将 AddTarget 用于 UIButton

ios - 从当前 View 和推送 View 处理后退按钮

php - NSInvalidArgumentException 使用 AFNetworking 将音频发送到服务器

ios - 如何使用 Siri 快捷方式在我的应用程序中显示特定页面?

ios - 使用dispatch_async NSURLSession 调用结果更新 UILabel

ios - 在 Xcode 上的编译时/运行时删除文本标签/按钮

objective-c - 如何更改导航栏背景