SwiftUI @MainActor 失去全局演员
SwiftUI @MainActor loses global actor
我有一个 ObservableObject class,我正在从我的视图中通过 @StateObject 调用它。 class 里面是一个函数,整个 class 被标记为@MainActor。在我看来,有一个带有 onChange 修饰符的 TextField,它通过 viewModel.funcname.
执行对该函数的调用
XCode 正在抱怨错误:
Converting function value of type '@MainActor (String) -> Void' to '(String) -> Void' loses global actor 'MainActor'
我已经为此研究了几个小时,但几乎一无所获。甚至 Apple 自己的文档也说只使用 await 但这行不通,至少我尝试过的许多方法都行不通。
这是我认为的代码:
TextField("", text: $viewModel.username)
.onChange(of: viewModel.username, perform: viewModel.editingChanged) // This is where the error occurs
这是我的class里面的函数(记得整个class都标了@MainActor):
func editingChanged(_ value: String) {
let jsonFetchUserExistsURL = URL(string: "https://blah.com")
let jsonFetchUserExistsTask = jsonFetch(jsonFetchUserExistsURL, defaultValue: [UserExists]())
guard isNetworkActive else { loadingAlert = true; return }
Task {
jsonFetchUserExistsTask.sink (receiveCompletion: { completion in
switch completion {
case .failure:
self.loadingState = .failed
case .finished:
self.checkUser()
}
},
receiveValue: { loadedUserExists in
self.userExists = loadedUserExists
}).store(in: &requests)
}
}
}
我尝试将 onChange 修改为如下内容:
.onChange(of: viewModel.username, perform: await viewModel.editingChanged)
.onChange(of: viewModel.username, perform: Task { await viewModel.editingChanged })
.onChange(of: viewModel.username, perform: Task.detached { await viewModel.editingChanged })
.onChange(of: viewModel.username, perform: DispatchQueue.main.async { viewModel.editingChanged })
我标记 class @MainActor 的全部原因是因为 XCode 抱怨该函数不在主线程上 运行。它编译但在控制台中抱怨几次后冻结。
我尝试过的一切似乎都没有任何改变。希望有人能对此有所启发。
请参阅我对 @MainActor
策略是否是解决潜在问题的正确方法的问题的评论,但要直接解决您的编译错误,您可以使用这种编译良好的语法:
.onChange(of: viewModel.username) { viewModel.editingChanged([=10=]) }
我有一个 ObservableObject class,我正在从我的视图中通过 @StateObject 调用它。 class 里面是一个函数,整个 class 被标记为@MainActor。在我看来,有一个带有 onChange 修饰符的 TextField,它通过 viewModel.funcname.
执行对该函数的调用XCode 正在抱怨错误:
Converting function value of type '@MainActor (String) -> Void' to '(String) -> Void' loses global actor 'MainActor'
我已经为此研究了几个小时,但几乎一无所获。甚至 Apple 自己的文档也说只使用 await 但这行不通,至少我尝试过的许多方法都行不通。
这是我认为的代码:
TextField("", text: $viewModel.username)
.onChange(of: viewModel.username, perform: viewModel.editingChanged) // This is where the error occurs
这是我的class里面的函数(记得整个class都标了@MainActor):
func editingChanged(_ value: String) {
let jsonFetchUserExistsURL = URL(string: "https://blah.com")
let jsonFetchUserExistsTask = jsonFetch(jsonFetchUserExistsURL, defaultValue: [UserExists]())
guard isNetworkActive else { loadingAlert = true; return }
Task {
jsonFetchUserExistsTask.sink (receiveCompletion: { completion in
switch completion {
case .failure:
self.loadingState = .failed
case .finished:
self.checkUser()
}
},
receiveValue: { loadedUserExists in
self.userExists = loadedUserExists
}).store(in: &requests)
}
}
}
我尝试将 onChange 修改为如下内容:
.onChange(of: viewModel.username, perform: await viewModel.editingChanged)
.onChange(of: viewModel.username, perform: Task { await viewModel.editingChanged })
.onChange(of: viewModel.username, perform: Task.detached { await viewModel.editingChanged })
.onChange(of: viewModel.username, perform: DispatchQueue.main.async { viewModel.editingChanged })
我标记 class @MainActor 的全部原因是因为 XCode 抱怨该函数不在主线程上 运行。它编译但在控制台中抱怨几次后冻结。
我尝试过的一切似乎都没有任何改变。希望有人能对此有所启发。
请参阅我对 @MainActor
策略是否是解决潜在问题的正确方法的问题的评论,但要直接解决您的编译错误,您可以使用这种编译良好的语法:
.onChange(of: viewModel.username) { viewModel.editingChanged([=10=]) }