我很好奇当Task的操作标记为@MainActor
时,下面代码段中的异步block()
将以什么优先级运行?
根据DispatchQueue
文档,主队列总是以.userInteractive
的qos运行。因此,我假设Task的@MainActor操作也将作为.userInteractive
运行——毕竟只有一个主线程。
但是,由于我们为Task
请求了自定义优先级,异步block
将使用什么优先级运行?
Task<Void, Never>(priority: priority) { @MainActor in
doStuffOnMainQueue() // .userInteractive
await block() // priority?
}
当您将@MainActor
限定符添加到闭包时,它显然会在主体上运行。但当它到达await block()
时,这意味着"挂起当前参与者(即本例中的主要参与者(,这样它就可以自由地做其他事情,并等待block()
的结果。">
关于block()
使用什么优先级的问题,这取决于它是如何声明的。假设block()
只是您传递给这个方法的一个闭包,那么根据我的经验,它运行的是您提供给Task
的priority
,而不是主要参与者。但是有很多变量(例如,您也可以为闭包参数指定@MainActor
;您可以调用在其他参与者上运行的某个方法;等等(,所以如果没有看到可复制的示例,我们就无法获得更具体的信息。
但是,最重要的是,当您await
某个东西时,等待的代码的参与者/优先级取决于您如何定义它,而不是您调用它的代码的上下文