0

我有一个 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 })

我标记类@MainActor 的全部原因是因为XCode 抱怨该函数没有在主线程上运行。它在控制台中抱怨了几次后编译但冻结了。

我尝试过的一切似乎都没有改变。希望有人可以对此有所了解。

4

1 回答 1

0

请参阅我对有关该@MainActor策略是否是解决潜在问题的正确方法的问题的评论,但要直接解决您的编译错误,您可以使用以下语法,该语法编译得很好:

.onChange(of: viewModel.username) { viewModel.editingChanged($0) }
于 2022-02-12T01:01:48.820 回答