假设您有一个在全局上下文中异步执行的方法.根据需要更新UI的执行情况.
private func fetchUser() async {
do {
let user = try await authService.fetchCurrentUser()
view.setUser(user)
} catch {
if let error = error {
view.showError(message: error.message)
}
}
}
切换到主线程的正确位置在哪里?
- 将
@MainActor
指定给fetchUser()
方法:
@MainActor
private func fetchUser() async {
...
}
- 将
@MainActor
指定给setUser(_ user: User)
和showError(message: String)
视图的方法:
class SomePresenter {
private func fetchUser() async {
do {
let user = try await authService.fetchCurrentUser()
await view.setUser(user)
} catch {
if let error = error {
await view.showError(message: error.message)
}
}
}
}
class SomeViewController: UIViewController {
@MainActor
func setUser(_ user: User) {
...
}
@MainActor
func showError(message: String) {
...
}
}
- 不要指定
@MainActor
.将await MainActor.run
或Task
与@MainActor
一起用于在主线程上运行setUser(_ user: User)
和showError(message: String)
(如DispatchQueue.main.async
):
private func fetchUser() async {
do {
let user = try await authService.fetchCurrentUser()
await MainActor.run {
view.setUser(user)
}
} catch {
if let error = error {
await MainActor.run {
view.showError(message: error.message)
}
}
}
}