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=]) }