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

编程知识 更新时间:2023-05-03 00:27:03

概览

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")
}

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

可以看到,两种时钟最后测量的时间都是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测试版系统的真机,也欢迎一起来讨论下实际设备上的测试结果。

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

更多推荐

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

本文发布于:2023-04-29 15:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/126e4ee39ed3cbc5e8eed62fea88e6b6.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:中才   有趣   对象   测试   如何在

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 111207文章数
  • 28402阅读数
  • 0评论数