有趣的小实验:如何在MacOS12上测试iOS16和MacOS13系统中才有的新Clock对象
Posted 大熊猫侯佩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有趣的小实验:如何在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")
直接运行的结果是这样的:
可以看到,两种时钟最后测量的时间都是10秒。
下面,我们在Playground运行后稍等1至2秒,立即合上MacBook Air的屏幕,摆拍一下 😉:
大约等了一小段时间后,重新打开屏幕,看一下运行结果:
如上图所示,ContinuousClock和SuspendingClock测试结果有了很大的不同:前者测量结果为38秒,而后者无论如何总为10秒。
前面说过了,这是因为可暂停时钟在系统睡眠时也会睡眠,正所谓“你睡我也睡”,妥妥的偷把懒。而连续时钟即使在系统睡眠时也会奋战在第一线。
在上述代码实际的测试中,屏幕合盖时间并不完全等同于系统睡眠的时间,即完全等于两个时钟返回时间的差。有时候合上屏幕十几秒再打开后,上面两个时钟测量时间也是一样的。
这可能是因为之前所说的系统延时睡眠所导致的。
另外,触发屏保或锁定屏幕后所导致的屏幕黑屏(未合上屏幕),似乎并不会使系统进入睡眠模式。
在iPhone模拟器中的实验
在iPhone模拟器(运行iOS 16beta系统)中测试代码是用SwiftUI写的,与上面类似,就不贴出来了。
这里简单说说让模拟器系统进入睡眠的方法:
- 在模拟器中运行测试App
- 将App切入后台
- 点击模拟器窗口右边外侧的电源键按钮使其黑屏
- 立即让运行模拟器的Mac进入睡眠状态
- 等待一段时间后唤醒Mac,然后进入模拟器主屏
- 将App切回前台
在模拟器测试的结果和Playground中测试的基本一致,都可以观测出ContinuousClock和SuspendingClock对象在系统睡眠时表现出的明显差异。
总结
在本篇博文中,我们讨论了如何在老Mac OS系统中测试在新iOS 16和Mac OS 13系统里才有的新时钟对象(ContinuousClock和SuspendingClock)的方法,并观测到了它们明显的差异。
如果小伙伴们有已经安装iOS 16或Mad OS 13测试版系统的真机,也欢迎一起来讨论下实际设备上的测试结果。
最后,感谢观赏,再会 😎。
以上是关于有趣的小实验:如何在MacOS12上测试iOS16和MacOS13系统中才有的新Clock对象的主要内容,如果未能解决你的问题,请参考以下文章
用户在iOS 13.4/macOS 10.15.4 Safari上发现有趣的Bug
iOS 14 和 macOS 10.16将会增加62款新表情