我有一個 ObservableObject 類,我通過@StateObject 從我的視圖中呼叫它。該類內部是一個函式,整個類都標記為@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
這是我班級中的函式(請記住,整個班級都標有@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 })
The entire reason I marked the class @MainActor is because XCode complained that the function wasn't running on the main thread. It compiled but froze after it complained a few times in the console.
Nothing I've tried seems to change anything. Hoping someone can shed some light on this.
uj5u.com熱心網友回復:
請參閱我對有關該@MainActor策略是否是解決潛在問題的正確方法的問題的評論,但要直接解決您的編譯錯誤,您可以使用以下語法,該語法編譯得很好:
.onChange(of: viewModel.username) { viewModel.editingChanged($0) }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424576.html
標籤:multithreading swiftui concurrency mainactor
