說我有這個代碼:
class Presenter {
var viewToUpdate: UIView!
func updateUI() {
viewToUpdate.backgroundColor = .red
}
}
class ShinyNewAsyncAwaitClass {
func doAsyncAwaitThing() async {
// make network call or something
}
}
class OtherClassThatICantUpdateToAsyncAwaitYet {
func doOldClosureBasedThing(completion: @escaping () -> Void) {
// make network call or something
completion()
}
}
class TheClassThatUsesAllThisStuff {
var newClass: ShinyNewAsyncAwaitClass!
var oldClass: OtherClassThatICantUpdateToAsyncAwaitYet!
var presenter: Presenter!
func doSomethingWithNewClass() {
Task {
await self.newClass.doAsyncAwaitThing()
// ---->>> What do I do here? <<<<----
await self.presenter.updateUI()
}
}
func doSomethingWithOldClass() {
oldClass.doOldClosureBasedThing {
DispatchQueue.main.async {
self.presenter.updateUI()
}
}
}
func justUpdateTheView() {
self.presenter.updateUI()
}
}
簡而言之,我有三個班。一個我可以更新到 async/await,另一個我不能,一個同時使用。兩者都需要訪問更新 UI 的函式,都需要在主執行緒上訪問該函式。
我在某處看到我可以將 @MainActor 添加到updateUI函式中,但如果我已經在主執行緒上并且我只想呼叫updateUI,就像justUpdateTheView我收到這個錯誤一樣:
Call to main actor-isolated instance method 'updateUI()' in a synchronous nonisolated context
Add '@MainActor' to make instance method 'justUpdateTheView()' part of global actor 'MainActor'
我不能定義justUpdateTheView為@MainActor,因為我們正在嘗試緩慢地將我們的專案更新為新的并發內容,這會導致需要進行更改的連鎖反應。
怎么做才能最好?我可以做這樣的事情:
func doSomethingWithNewClass() {
Task {
await self.newClass.doAsyncAwaitThing()
DispatchQueue.main.async {
self.presenter.updateUI()
}
}
}
它可以編譯,但有什么需要注意的問題嗎?
uj5u.com熱心網友回復:
您可以執行以下操作以在以下位置運行 UI 代碼MainActor:
func doSomethingWithNewClass() {
Task {
await self.newClass.doAsyncAwaitThing()
await MainActor.run {
self.presenter.updateUI()
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/454395.html
