• 有趣的小实验:如何在MacOS12上测试iOS16和MacOS13系统中才有的新Clock对象


    在这里插入图片描述

    概览

    Apple在新Concurrency库(目前在Xcode 14beta中显示的名称为_Concurrency,说明该库还处于测试中)中提供了两个新的时钟类型,分别是连续时钟(ContinuousClock)和可暂停时钟(SuspendingClock)。

    在这里插入图片描述

    在这里插入图片描述

    它们看起来很好很强大的样子!不过问题来了,它们只能在iOS 16和Mac OS 13(Ventura)中使用。

    那么,我们怎么在没有安装iOS 16和Mac OS 13设备的情况下测试它们呢?

    下面,我们就一起在安装目前最新正式版Mac OS 12.5.1 (Monterey)操作系统的Macbook air M2上做个非常简单的小实验,看能不能成功测试出这两个新Clock对象功能上的差异吧。

    Let‘s Go!😉


    ContinuousClock和SuspendingClock简述

    ContinuousClock和SuspendingClock这两个时钟对象的功能很简单,就是用来测量时间。

    它们有一个很大的区别就是:前者即使在系统睡眠(system asleep)时也不会停止计时,而后者则会停止计时。

    不过这里的“系统睡眠”在iPhone和Mac上到底是什么意思呢?

    在iPhone中,按下电源键会导致设备黑屏从而进入睡眠状态;

    而在Mac中,如果是笔记本,合上屏幕会进入睡眠状态;否则可以点击系统菜单中的 “睡眠” 使其进入睡眠状态。

    在这里插入图片描述

    但在实际测试中,结果貌似iPhone按下电源键或MacBook合上屏幕并不会立即使系统进入睡眠状态,系统可能会根据当前的负载情况选择延时睡眠。

    延时睡眠会导致测试观察结果的不确定性,这在后文中会有详述。

    在Playground中的实验

    首先,最简单的方式是在Playground中测试,这里Playground模版类型要选择iOS而不能是macOS

    在这里插入图片描述

    否则,就会是下面这般惨状:

    在这里插入图片描述

    因为iOS模版的Playground实际上是在iOS 16系统的模拟环境中运行的,所以代码不会报错。

    下面是测试代码(需要在Xcode 14beta中运行),十分简单:

    import SwiftUI
    import PlaygroundSupport
    
    PlaygroundPage.current.needsIndefiniteExecution = true
    
    let c_clock = ContinuousClock()
    let s_clock = SuspendingClock()
    
    Task {
        let result = try await c_clock.measure {
            for i in 0..<10 {
                try await Task.sleep(until: .now + .seconds(1.0), clock: .continuous)
                print("C: \(i)")
            }
        }
        
        print("C take \(result.components.seconds) s")
    }
    
    Task {
        let result = try await s_clock.measure {
            for i in 0..<10 {
                try await Task.sleep(until: .now + .seconds(1.0), clock: .suspending)
                print("S: \(i)")
            }
        }
        
        print("S take \(result.components.seconds) s")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    直接运行的结果是这样的:

    在这里插入图片描述

    可以看到,两种时钟最后测量的时间都是10秒。

    下面,我们在Playground运行后稍等1至2秒,立即合上MacBook Air的屏幕,摆拍一下 😉:

    在这里插入图片描述

    大约等了一小段时间后,重新打开屏幕,看一下运行结果:

    在这里插入图片描述

    如上图所示,ContinuousClock和SuspendingClock测试结果有了很大的不同:前者测量结果为38秒,而后者无论如何总为10秒。

    前面说过了,这是因为可暂停时钟在系统睡眠时也会睡眠,正所谓“你睡我也睡”,妥妥的偷把懒。而连续时钟即使在系统睡眠时也会奋战在第一线。

    在上述代码实际的测试中,屏幕合盖时间并不完全等同于系统睡眠的时间,即完全等于两个时钟返回时间的差。有时候合上屏幕十几秒再打开后,上面两个时钟测量时间也是一样的。

    这可能是因为之前所说的系统延时睡眠所导致的。

    另外,触发屏保或锁定屏幕后所导致的屏幕黑屏(未合上屏幕),似乎并不会使系统进入睡眠模式。

    在iPhone模拟器中的实验

    在iPhone模拟器(运行iOS 16beta系统)中测试代码是用SwiftUI写的,与上面类似,就不贴出来了。

    这里简单说说让模拟器系统进入睡眠的方法:

    1. 在模拟器中运行测试App
    2. 将App切入后台
    3. 点击模拟器窗口右边外侧的电源键按钮使其黑屏
    4. 立即让运行模拟器的Mac进入睡眠状态
    5. 等待一段时间后唤醒Mac,然后进入模拟器主屏
    6. 将App切回前台

    在模拟器测试的结果和Playground中测试的基本一致,都可以观测出ContinuousClock和SuspendingClock对象在系统睡眠时表现出的明显差异。

    总结

    在本篇博文中,我们讨论了如何在老Mac OS系统中测试在新iOS 16和Mac OS 13系统里才有的新时钟对象(ContinuousClock和SuspendingClock)的方法,并观测到了它们明显的差异。

    如果小伙伴们有已经安装iOS 16或Mad OS 13测试版系统的真机,也欢迎一起来讨论下实际设备上的测试结果。

    最后,感谢观赏,再会 😎。

  • 相关阅读:
    tracy 学习
    数据结构计算二叉树的深度和节点个数
    深度学习mAP
    【极速审稿】物联网传感器类SCI&EI,仅17天录用,计算机领域SCI快刊盘点
    通过虚拟机搭建个人NAS
    【CSS】字体图标与favicon图标
    FutureTask配合Thread实现处理有返回结果的源码、逻辑与架构分析
    Android app专项测试之耗电量测试
    【听课笔记】复旦大学遗传学_08遗传分析方法
    奇安信笔试C++
  • 原文地址:https://blog.csdn.net/mydo/article/details/126451422