繁体   English   中英

MVVM:使用闭包,无主或弱自我将View与ViewModel绑定?

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

我正在实现一个简单的Master-Detail应用程序,其中Master viewController管理一个表视图,该视图显示对REST服务的调用结果。 Detail viewController管理一个视图,其中显示有关在Master中选择的项目的更多信息。 常见情况。

我正在尝试应用MVVM模式。 Master viewController ,我viewModel这种方式创建并初始化它的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 ,所以我不完全清楚。

[无主的自我] 这告诉您的模型不要持有对ViewController的强引用

Apple文件明确指出:

“就像弱引用一样, 无主引用并不能保持对它引用的实例的强烈保持。 然而,与弱引用不同,假定无主引用始终具有值“。

在您的情况下 ,总是有ViewController 因此,无主参考的好处是它的nonoptional 每次使用时都不需要打开包装

unowned weak的区别在于, weak被宣告为可选, unowned被宣告为unowned 如果你知道自己不会是nil使用unowned ,如果你不知道:使用weak

Unowned ,当你100%肯定的对象将不会被释放时使用。

weak你然后需要照顾它的引用计数问题。

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

我一般这样做。 然后,您可以拥有一个强大的self引用,以避免在块运行期间分配它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM