ios - MVVM:使用闭包、无主或弱 self 将 View 与 ViewModel 绑定(bind)?

标签 ios swift mvvm closures weak-references

我正在实现一个简单的主从应用程序,其中 Master viewController 管理一个 TableView ,该 TableView 显示调用 REST 服务的结果。 Detail viewController 管理一个 View ,我在其中显示有关在 Master 中选择的项目的更多信息。常见场景。

我正在尝试应用 MVVM 模式。在 Master viewController 中,我以这种方式创建和初始化它的 viewModel:

lazy private var viewModel: ListViewModel = {
    return ListViewModel()
}()

override func viewDidLoad() {
    super.viewDidLoad()

    initViewModel()
}

private func initViewModel() {
    viewModel.onModelChange = { [weak self] () in
        DispatchQueue.main.async {
            self?.tableView.reloadData()
        }
    }

    viewModel.fetchData()
}

我的问题是:在提供给 viewModel 的闭包中,self 应该是 weak 还是 unowned ?我找到了一个实现与我的场景类似的示例,将其设置为 weak,另一个示例将其设置为 unowned,所以我不是很清楚。

最佳答案

[无主的 self ]。这告诉您的模型不要持有对 ViewController

的强引用

Apple 文档明确指出:

“Like weak references, an unowned reference does not keep a strong hold on the instance it refers to. Unlike a weak reference, however, an unowned reference is assumed to always have a value”.

在您的情况下,总是有ViewController。所以无主引用的好处是它是nonoptional。每次使用无需解包

关于ios - MVVM:使用闭包、无主或弱 self 将 View 与 ViewModel 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50432831/

相关文章:

iOS Fido2 BLE 认证器注册响应问题

swift - Generic Decodable 停止使用 swift 4.1

iOS:在锁定屏幕上使用控件时,AVPlayer 会播放多个音频实例

c# - WPF Datepicker 使用 MVVM 返回先前选择的日期

javascript - 如何在 swift 4 的 WKWebView 中从网页中删除 DIV 标签?

iOS:将 OpenAL 的变调和管道输出输出到缓冲区

ios - 如何为 iOS 的 UIWebView 中加载的文档(doc、html)创建缩略图

class - Swift 中的静态函数和类函数有什么区别?

c# - 通过从具有多个 View 模型的选项卡单击按钮导航到另一个选项卡项不起作用

unit-testing - 需要帮助测试 Windows Phone 8 中的绑定(bind)