如果我宣告此協議和模型:
protocol SubScene: UIViewController {
func doSomething()
}
struct Model {
let subScene: SubScene
func longCalculation() async {
// Some long-running operation...
await subScene.doSomething()
}
}
class MyVC: UIViewController, SubScene {
func doSomething() {
performSegue(withIdentifier: "segue", sender: nil)
}
}
let myVC = MyVC()
let model = Model(subScene: myVC)
Task.detached {
await model.longCalculation()
}
我已經宣告了一個限制為 的協議,以及一個從異步背景關系UIViewController呼叫協議方法的模型。doSomething()由于UIViewControlleris a MainActor,我的期望是doSomething()應該在主執行緒上呼叫它。
但是,事實并非如此。事實上,該await關鍵字導致 Swift 發出警告,表明它沒有呼叫異步方法。經驗測驗表明,doSomething()通常最終會在其他執行緒上被呼叫。
我可以通過注釋doSomething()為MainActor:
protocol SubScene: UIViewController {
@MainActor func doSomething()
}
這消除了 Swift 警告,并導致在doSomething()正確的執行緒上被呼叫。
這是正確的方法,還是有另一種方法可以避免我的所有協議方法都撒上@MainActor.
uj5u.com熱心網友回復:
或者,您可以將整個協議標記為@MainActor,例如,
@MainActor protocol SubScene: AnyObject {
func doSomething()
}
這避免了單獨宣告每個符合方法的需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/489114.html
