我有以下视图模型:
@MainActor
final class ProfileViewModel: ObservableObject {
let authService: AuthService
@Published var userHandle: String = "Unknown"
nonisolated init(authService: AuthService, appState: AppState) {
self.authService = authService
appState.$userData
.receive(on: DispatchQueue.main)
.map {
$0.user?.displayName ?? "Unknown"
}
.assign(to: &$userHandle)
}
}
这会导致错误:"主参与者隔离属性'$userHandle'cannot used 'inout'from a non—isolated context",位于". assign(to:)"行.
这在某种程度上是意料之中的.据我所知,Combine的动态线程切换并不满足Swift并发模型的编译时保证.
下面是让我困惑的地方.如果我从类中删除@ MainActor注释,并将其应用于userHandle属性,如下所示:
final class ProfileViewModel: ObservableObject {
let authService: AuthService
@MainActor @Published var userHandle: String = "Unknown"
nonisolated init(authService: AuthService, appState: AppState) {
self.authService = authService
appState.$userData
.receive(on: DispatchQueue.main)
.map {
$0.user?.displayName ?? "Unknown"
}
.assign(to: &$userHandle)
}
}
代码编译时没有问题.
从逻辑上讲,这应该引发相同的错误,因为userHandle在两种情况下都是Main actor隔离的.我想知道这是不是编译器的怪癖,还是有一个我不明白的更深层次的语义差异.