Задать вопрос
@sportredwhite

Не срабатывает dataSource?

Подскажите плз, в чём может быть причина или куда копать.

У меня не обновляется таблица, как будто tableView.reloadData() не срабатывает,
хотя дебажил вроде бы норм и массив movies переписывается на данные с инета, а вот dataSource почему то не вызывается( В чём может быть причина, подскажите плз

Архитектура примерно такая)

ViewModel -> Presenter -> ViewController
ViewModel -> DataSource

Есть ViewModel, где делаю запрос на сервер, чтобы получить список фильмов

class ListMoviesViewModelTable: ListMoviesViewModelTableProtocol {
    
    let network: Network = Network()
    var movies: [Movie] = []
    
    var numberPage: Int = 1
    
    func fetchMovies(with page: Int, completion: @escaping () -> ()) {
        network.numberPage = page
        network.loadMovies { (result) in
            switch result {
            case .success(let result):
                DispatchQueue.main.async {
                    self.movies.append(contentsOf: result.movies)
                    completion()
                }
            case .failure(let errorText):
                print(errorText)
            }
        }
    }
    
    func numberOfCell() -> Int {
        return movies.count
    }
    
    func cellForRowAt(index: Int) -> ListMoviesViewModelTableCellProtocol {
        let movie = movies[index]
        return ListMoviesViewModelTableCell(movie: movie)
    }
    
    func didSelectCell(at index: Int) -> DetailMovieViewModelProtocol  {
        let movie = movies[index]
        return DetailMovieViewModel(movie: movie)
    }
    
}


В Presenter создаю метод, чтобы дальще передать ViewController

func fetchMovies() {
        viewModelTable.fetchMovies(with: viewModelTable.numberPage) {
            self.view.reloadData()
        }
    }


В ViewController вызываю presenter.fetchMovies()

class ListMoviesViewController: UIViewController, ViewControllerProtocol {
    
    @IBOutlet weak var tableView: UITableView!
    
    var presenter: PresenterProtocol!
    var dataSource: ListMoviesDataSource!
    let configuration: ConfigurationProtocol = ListMoviesConfiguration()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        configuration.configurate(with: self)
        delagating()
        
        presenter.fetchMovies()
    }
    
    private func delagating() {
        tableView.dataSource = dataSource
        tableView.delegate = self
    }
    
    func reloadData() {
        tableView.reloadData()
    }
}


Сам DataSource выглядет вот так, который содержит viewModelTable

class ListMoviesDataSource: NSObject, UITableViewDataSource {
    
    weak var view: ViewControllerProtocol!
    var viewModelTable = ListMoviesViewModelTable()
    
    var tableView: UITableView!
    
    init(view: ViewControllerProtocol) {
        super.init()
        self.view = view
        self.setTableView(from: view)
    }
    
    private func setTableView(from view: ViewControllerProtocol) {
        tableView = view.getTableView()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModelTable.numberOfCell()
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ListMoviesTableViewCell
        cell.viewModelCell = viewModelTable.cellForRowAt(index: indexPath.row)
        cell.configure()
        return cell
    }
    
}
  • Вопрос задан
  • 109 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
doublench21
@doublench21 Куратор тега Swift
Доброго времени суток. Вы меня конечно извините, но вряд ли найдётся герой, который осилит эти шматки кода. Могу лишь дать небольшой совет, если ваша таблица или коллекция не обновляется при вызове перезагрузки, смотреть нужно в соответствующих методах cell for item at.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы