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
,所以我不是很清楚。
unowned
和 weak
之间的区别在于 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
。每次使用都不需要解包
我正在实现一个简单的 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
,所以我不是很清楚。
unowned
和 weak
之间的区别在于 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
。每次使用都不需要解包