首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DispatchQueue.global(qos:.default):当应用程序被背景接地或屏幕锁定时,如何挂起?

DispatchQueue.global(qos:.default):当应用程序被背景接地或屏幕锁定时,如何挂起?
EN

Stack Overflow用户
提问于 2019-04-01 04:32:04
回答 1查看 1.7K关注 0票数 3

Swift新手:将Objective集成代码移植到Swift上,由Dart/Dart调用。当我背景或锁定屏幕遗留的Obj应用程序,它几乎立即暂停所有的执行。然而,在我的Swift代码端口中没有发生相同的行为,我在Swift中使用的DispatchQueue与遗留的Obj应用程序中的相同,

挂起的原因很重要,因为一旦用户锁定了iPhone屏幕,AppleHealth就会加密它的所有数据,并且它是不可用的。我的理解也是正确的,当您挂起一个DispatchQueue时,当前正在执行的块将完成,但是子序列块将不会开始执行。据我所知,Swift代码端口模仿Obj逻辑,任何关于它的行为为何不同或我可能缺少什么的提示都是非常感谢的。

我要用

代码语言:javascript
运行
复制
DispatchQueue.global(qos: .default).async { 
/* code */ 
}

如果能让新的应用程序立即挂起我提交给DispatchQueue的所有执行代码,当背板或锁屏时,我会非常高兴。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-01 06:52:00

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

你在这个应用程序中做了什么让它在后台运行吗?例如,如果您通过Xcode调试器运行应用程序(例如,这样您可以查看print语句或其他什么),它会改变应用程序的生命周期并使其在后台运行。( Xcode“观察者效应”?( Lol.)例如,您是否通过Xcode调试器运行此程序?

此外,如果您的应用程序有一定的后台功能,这也可以保持应用程序的活力。

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

考虑这样的事情:

代码语言:javascript
运行
复制
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控制台应用程序,
  • 在控制台应用程序中,我用“Action”启用了调试日志?“包括调试消息”,
  • 过滤日志,所以我只看到子系统中的活动(我个人总是使用包标识符),
  • 直接在iOS设备上运行我的应用程序。

我们可以清楚地看到,当我挂起应用程序时,应用程序就会停止(包括在后台队列上运行的任务)。(显然,除了上面的os_log消息之外,我还在AppDelegate中放置了类似的语句,这样我也可以在这里看到生命周期事件。)总之,这就是我的控制台显示的:

当“滴答5”出现时,我离开了我的应用程序,在应用程序被完全挂起之前花了几秒钟的时间,但是你可以看到,在“滴答7”和“applicationDidEnterBackground”出现之后,应用程序停止了运行。大约10秒后,我重新启动了这个应用程序,这时你会看到这个应用恢复了活力,然后继续滴答作响,就在它停下来的地方。

所以,如果你的应用程序还在运行,要么它被附加到Xcode调试器,要么你有什么东西让应用程序在后台运行。但是通常情况下,当你离开一个应用程序时,它会被挂起,你会看到我上面描述的行为。

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

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

https://stackoverflow.com/questions/55448140

复制
相关文章

相似问题

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