我将逻辑代码放入viewModel
。 view
调用viewController
中的一种方法。然后,该方法通过使用viewModel
调用#selectors
中的其余方法。在tableView
需要重新加载tableView.reloadData()
之前,它可以正常工作。该部分显然需要在view
中。
通常,这可以通过使用多个闭包来实现。但是因为#selectors
不能有参数,所以我在调用的最后一个方法中没有completion()
回调。所以,我的问题是,如何解决这个问题?是否有使用#selectors
的替代方法?订阅view
的最后一种方法时,在viewModel
中应该有观察者吗? RxSwift可以替代吗?还是有使用#selectors
的解决方法?
RxSwift是一个很好的选择,但是如果您需要的内容不那么繁重,则需要使用委托模式:
protocol ViewDelegate {
// Other functions you might need
func reloadTableView()
}
Then in your viewController, you implement these:
class ViewController: ViewDelegate {
func reloadTableView() {
tableView.reloadData()
}
}
在某个地方,您需要在视图模型中定义委托:
weak var viewDelegate: ViewDelegate
以及在创建类时分配它:
let model = ViewModel()
let view = ViewController()
model.viewDelegate = view
Swift官方文档提供了有关协议的更多信息:https://docs.swift.org/swift-book/LanguageGuide/Protocols.html