3

Swift Newbie:将 Objective-C AppleHealth 集成代码移植到由 Flutter/Dart 调用的 Swift。当我背景或锁定旧版 Obj-C 应用程序时,它几乎会立即暂停所有执行。但是,在我的 Swift 代码端口中不会发生相同的行为,我在 Swift 中使用与旧版 Obj-C 应用程序中相同的 DispatchQueue,

暂停很重要的原因是,一旦用户锁定 iPhone 屏幕,AppleHealth 会加密其所有数据并且不可用。我的理解也是正确的,当您暂停 DispatchQueue 时,当前执行的块将完成,但后续块不会开始执行。据我所知,Swift 代码移植模仿了 Obj-C 逻辑,任何关于它为什么表现不同或我可能遗漏的任何提示都将不胜感激。

我正在使用

DispatchQueue.global(qos: .default).async { 
/* code */ 
}

如果可以让新应用程序立即暂停我提交给 DispatchQueue 的所有执行代码,那么在后台或锁定屏幕时我会非常高兴。

4

1 回答 1

3

当一个应用程序被挂起时,任何正在运行的东西,无论是在主队列还是后台global队列,也会被挂起。

您是否在应用程序中执行任何操作以使其在后台运行?例如,如果您通过 Xcode 调试器运行应用程序(例如,您可以查看print语句或其他内容),它会更改应用程序生命周期并使其在后台运行。(Xcode“观察者效应”?哈哈。)例如,你是通过 Xcode 调试器运行这个吗?

此外,如果您的应用启用了某些后台功能,这也可以使应用保持活动状态。

由于您无法通过 Xcode 调试器运行应用程序来查看应用程序生命周期,因此我将演示使用统一日志记录来监视我的应用程序进度的过程。使用统一日志记录,我可以从我的 macOS 控制台监控我的 iPhone 上的这些日志语句,甚至根本不需要运行 Xcode。

考虑类似的事情:

import UIKit
import os.log

private let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "ViewController")

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        os_log("viewDidLoad", log: log, type: .debug)
        startTask()
    }

    func startTask() {
        DispatchQueue.global().async {
            var i = 0
            while true {
                let start = Date()
                while Date().timeIntervalSince(start) < 1 { }
                os_log("tick %d", log: log, type: .debug, i)
                i += 1
            }
        }
    }
}

(注意,通常你不应该这样旋转,但我这样做是为了有一个故意让 CPU 保持忙碌的进程。)

所以我然后:

  • 安装在我的设备上,
  • 退出 Xcode,
  • 启动 macOS 控制台应用程序,
  • 在控制台应用程序中,我使用“操作”»“包含调试消息”启用了调试日志记录,
  • 过滤日志,所以我只能看到来自我的子系统的活动(我个人总是使用我的包标识符),并且
  • 直接在我的 iOS 设备上运行我的应用程序。

当我挂起应用程序时,我们可以清楚地看到应用程序停止(包括在后台队列上运行的此任务)。(显然,除了上面的os_log消息之外,我还在我的AppDelegate.

安慰

当“tick 5”出现时我离开了我的应用程序,在应用程序完全暂停之前需要几秒钟,但你可以看到应用程序在“tick 7”和“applicationDidEnterBackground”出现后停止运行。大约 10 秒后我重新启动了应用程序,此时您会看到应用程序恢复生机并继续滴答作响,就在它停止的地方。

因此,如果您的应用程序仍在运行,要么它附加到 Xcode 调试器,要么您有一些东西使应用程序在后台运行。但一般来说,当你离开一个应用程序时,它会被暂停,你会看到我上面概述的行为。

顺便说一句,有关使用统一日志记录、配置设备等的更多信息,请参阅 WWDC 2016 视频统一日志记录和活动跟踪

于 2019-04-01T06:52:00.440 回答