MVVM:使用闭包、无主或弱自我将视图与 ViewModel 绑定?

MVVM: binding the View with the ViewModel with closures, unowned or weak self?

我正在实现一个简单的 Master-Detail 应用程序,其中 Master viewController 管理一个 table 视图,该视图显示调用休息服务。 Detail viewController 管理一个视图,我在其中显示有关 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,所以我不是很清楚。

unownedweak 之间的区别在于 weak 被声明为可选,而 unowned 不是。如果你知道self不会nil使用unowned,如果你不知道:使用weak

Unowned 当您 100% 确定对象不会被释放时使用。

weak 然后你需要处理它的引用计数问题。

viewModel.onModelChange = { [weak self] () in
    guard let strongSelf = self else { return }
    strongSelf.tableView.reloadData()
}

我一般都是这样做的。然后,您持有 self 的强引用,以避免在 运行.

块期间分配它

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

的强烈引用

苹果文档明确指出:

“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。每次使用都不需要解包