Rom*_*man 5 mvvm async-await swift structured-concurrency
假设我们有一些异步代码。在某些时候,我们必须将其包装在 a 中Task {\xe2\x80\xa6},以便从同步上下文运行它。\n那么规范的方法在哪里呢?ViewModel或者ViewController?
如果我们用Task {\xe2\x80\xa6}in包装它ViewModel,ViewModel函数就会变得有效同步,并且调用它们ViewController仍然需要所有这些完成/委托/闭包/RX 在异步工作完成后完成一些 UI 更新。
另一方面,如果我们将ViewModel函数标记为并从主体内部async调用它们,似乎可以解决问题。那么这是一条路吗?ViewControllerTask {\xe2\x80\xa6}
我不会重新引入遗留完成模式(闭包、委托等)。这违背了 Swift 并发性的目的,即优雅地管理异步依赖项。例如,在 WWDC 2021 视频Swift 并发:更新示例应用程序中,它们展示了我们如何通过 Swift 并发消除完成处理程序的示例。
\n因此,将异步视图模型方法指定为async。然后,视图控制器将使用Task {\xe2\x80\xa6}进入Swift并发的异步上下文,以便它可以调用视图模型的await方法async,然后在完成后触发UI更新。
但是,使用Task {\xe2\x80\xa6}不限于视图控制器。视图模型也可以使用它(例如,需要保存任务以便以后可能因某种原因取消它)。
但你问:
\n\n\n如果我们将
\nViewModel函数标记为并从体内async调用它们,似乎可以解决问题。那么这是一条路吗?ViewControllerTask {\xe2\x80\xa6}
恰恰。如果该方法确实在执行异步操作,则将其标记为async,视图控制器将从Task {\xe2\x80\xa6}.
综上所述,在 SwiftUI 项目中,视图模型经常使用ObservableObject和向视图传达更新@Published向视图传达更新,我将保持这种直观和自然的模式。到那时,您选择进入异步上下文的位置就变得不那么引人注目/关键了。
话虽如此,但从可测试性的角度来看,您仍然希望能够知道视图模型\xe2\x80\x99s异步任务何时完成,所以我可能仍然会创建视图模型\xe2\x80\x99s方法async。
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |