MVVM我应该将网络获取放入ViewModel还是View?

时间:2019-11-26 22:13:48

标签: swift uitableview networking mvvm request

我正在尝试学习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]
    }
}

0 个答案:

没有答案