标有 @MainActor 的函数中的异步调用是否也在主线程上运行?

yam*_*mbo 5 asynchronous task async-await swift swiftui

我有一个标记为 的函数@MainActor,它进行异步调用,然后更新一个@Publishedvar,该 var 随后将更新 UI。异步调用是否会在主线程上阻塞,或者发布的变量的更新是否是主线程上唯一要做的事情?

@Published var users: [User] = []

@MainActor
func getUsers() {
    Task {
        // Is the async call blocking on the main thread here?
        users = await userRepository.getUsers()
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,是否users在主线程上更新,而异步调用发生UserRepository在后台完成?或者,该异步调用是否也在主线程上运行并阻塞?

Ash*_*lls 2

初始化Task

Task(priority:operation:)
Run Code Online (Sandbox Code Playgroud)

继承调用者的优先级和参与者上下文,因此在您的情况下,当 func 被标记时@MainActor,它将在主队列上运行。

userRepository.getUsers()在另一个队列上运行,然后当它返回时,您func将继续返回主队列。

当它运行时,主队列不会被阻塞,但 func 本身会被挂起。