[英]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.