我正在尝试学习MVVM,这对我来说是全新的,但是我了解了它的一般要点。但是令我困扰的一件事是,我应该在哪里获取模型类型的网络调用。我在这里和那里读了一些文章,当然都给出了不同的答案,现在我将其放在视图中,在viewDidLoad()中调用。
似乎不对,因为视图只应包含与UI相关的内容,并正在考虑将其放入视图模型中并从那里调用fetch函数。
当然,我知道人们在网上观看辩论时,对此有不同的偏好。但仍然..我想编写有意义的代码。
如果我完全不赞成所谈论的内容,并且要视情况而定,请启发我。
下面是我的示例天气项目,该项目正在获取每日天气请求。
class WeatherListViewController: UIViewController {
@IBOutlet var tableView: UITableView!
private var request: AnyObject?
private var weatherListViewModel = WeatherListViewModel()
private let sessionProvider = URLSessionProvider()
private let cellId = "cell"
override func viewDidLoad() {
super.viewDidLoad()
fetchDailyWeather()
setupTableViewDataSource()
}
private func setupTableViewDataSource() {
tableView.dataSource = self
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
}
// TODO: - Put this networking request in viewModel???
private func fetchDailyWeather() {
sessionProvider.request(type: WeatherWrapper.self, service: WeatherService.daily) { [weak self] result in
switch result {
case let .success(weatherWrapper):
let weathers = weatherWrapper.daily.weathers
for weather in weathers {
self?.weatherListViewModel.addWeather(weather)
DispatchQueue.main.async {
self?.tableView.reloadData()
}
}
case let .failure(error):
print("ERROR: \(error)")
}
}
}
}
// This is of course in a different file. For now it's a struct, but will change to class when appropriate.
struct WeatherListViewModel {
private(set) var weathers = [Weather]()
// var date: Date {
// return
// }
mutating func addWeather(_ weatherModel: Weather) {
weathers.append(weatherModel)
}
func numberOfRows(inSection section: Int) -> Int {
return weathers.count
}
func modelAt(_ index: Int) -> Weather {
return weathers[index]
}
}