首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么BackgroundTasks中的异步/长时间运行操作不能工作?

为什么BackgroundTasks中的异步/长时间运行操作不能工作?
EN

Stack Overflow用户
提问于 2020-04-23 21:33:23
回答 1查看 302关注 0票数 1

试图将BackgroundTasks用于iOS 13+。长期运行的操作似乎不起作用:

代码语言:javascript
复制
// in AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

     BGTaskScheduler.shared.register(forTaskWithIdentifier: "foo.bar.name", using: nil) { task in
         print("start!")

         task.expirationHandler = {
             // Not executed
             print("expired!")
         }
         DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
             // Not executed
             print("finish!")
             task.setTaskCompleted(success: true)
         }
     }

     return true
 }

 func applicationDidEnterBackground(_ application: UIApplication) {
     BGTaskScheduler.shared.cancelAllTaskRequests()
     let request = BGProcessingTaskRequest(identifier: "foo.bar.name")
     request.earliestBeginDate = nil // or Date(timeIntervalSinceNow: 0) or Date(timeIntervalSinceNow: 5)...
     do {
       try BGTaskScheduler.shared.submit(request)
     } catch let e {
         print("Couldn't submit task: \(e)")
     }
 }

我还尝试使用带有Operation的队列(为此,我对流进行了同步建模)。这也没用。一旦有些事情需要一段时间才能完成,它就会被卡住。

它不会将任何其他内容记录到控制台,没有错误,也没有过期的任务消息。它显示了长期运行操作之前的最后一条消息,仅此而已。我确认,通过存储偏好并在重新启动时对其进行检查,它不会向前推进。它不是储存的。

我将"foo.bar.name“添加到info.plist (在”允许的后台任务调度器标识符“中),并启用了用于后台获取和后台处理的功能。我正在使用iPhone 13.3.1并使用Xcode 11.4.1在iOS上进行测试。

补充说明:

  • 我立即开始执行任务,如下所述:开发
  • 我还用苹果的演示项目进行了测试。它也显示了同样的问题:数据库清理操作没有完成(我在cleanDatabaseOperation.completionBlock开头添加了一个日志,但它从未显示)。
EN

回答 1

Stack Overflow用户

发布于 2020-04-24 05:01:05

以下是几点意见:

  1. 您应该检查register的结果代码。你应该确保你没有看到你的“不能提交任务”日志语句。
  2. 根据链接您共享的中的讨论,您是否在submit调用之后立即设置了断点?这完成了两件事:
代码语言:javascript
复制
- First, it makes sure you hit that line (as opposed, for example, to the `SceneDelegate` methods).
- Second, if you just pause the app manually, some random amount of time after the app has gone into background, that’s too late. It has to be in that breakpoint _immediately_ after you call `submit`. Then do `e` command. Then resume execution.

无论如何,当我这样做,运行您的代码,BGProcessingTaskRequest运行良好。我运行的是iOS 13.4.1 (和您一样,Xcode 11.4.1)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61397372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档