有趣的小实验:如何在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写的,与上面类似,就不贴出来了。

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

  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对象的主要内容,如果未能解决你的问题,请参考以下文章

用户在iOS 13.4/macOS 10.15.4 Safari上发现有趣的Bug

macOS Sierra 正式版升级须知一览

iOS 14 和 macOS 10.16将会增加62款新表情

有没有办法在iOS 12.2上使用过时版本的Xcode和macOS运行应用程序?

iOS 15 如何让 App 启动更快?

iOS 13.4越狱工具发布:仅限macOS系统