MVVM:将视图与视图模型绑定,闭包,无主或弱自我?



我正在实现一个简单的主-从应用程序,其中主viewController管理一个表视图,该视图显示对 REST 服务的调用结果。详细信息viewController管理一个视图,在该视图中显示有关主控形状中所选项目的详细信息。常见方案。

我正在尝试应用MVVM模式。在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,所以我不完全清楚。

[无主自我]。这会告诉您的模型不要对ViewController进行强引用

苹果文件明确指出:

"就像弱引用一样,无主引用不会保持强引用 保留它引用的实例。然而,与弱引用不同, 假定无主引用始终具有值"。

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

Unowned

在100% 确定对象不会被解除分配时使用。

weak,您需要处理其引用计数问题。

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

我通常这样做。然后,您持有self的强引用,以避免在块运行期间分配它。

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

最新更新