Skip to content

Commit 539c076

Browse files
committed
Refactor
1 parent 749ad68 commit 539c076

File tree

4 files changed

+22
-28
lines changed

4 files changed

+22
-28
lines changed

ExampleMVVM/Presentation/MoviesScene/MoviesList/View/MoviesListTableView/MoviesListTableViewController.swift

+14-18
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,24 @@ final class MoviesListTableViewController: UITableViewController {
1111

1212
var posterImagesRepository: PosterImagesRepository?
1313
var nextPageLoadingSpinner: UIActivityIndicatorView?
14-
14+
1515
var viewModel: MoviesListViewModel!
16-
var items: [MoviesListItemViewModel] = [] {
17-
didSet { reload() }
18-
}
19-
16+
2017
override func viewDidLoad() {
2118
super.viewDidLoad()
2219
tableView.estimatedRowHeight = MoviesListItemCell.height
2320
tableView.rowHeight = UITableView.automaticDimension
2421
bind(to: viewModel)
2522
}
26-
23+
2724
private func bind(to viewModel: MoviesListViewModel) {
2825
viewModel.loadingType.observe(on: self) { [weak self] in self?.update(isLoadingNextPage: $0 == .nextPage) }
2926
}
30-
27+
3128
func reload() {
3229
tableView.reloadData()
3330
}
34-
31+
3532
func update(isLoadingNextPage: Bool) {
3633
if isLoadingNextPage {
3734
nextPageLoadingSpinner?.removeFromSuperview()
@@ -48,31 +45,30 @@ final class MoviesListTableViewController: UITableViewController {
4845

4946
// MARK: - UITableViewDataSource, UITableViewDelegate
5047
extension MoviesListTableViewController {
51-
48+
5249
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
53-
return items.count
50+
return viewModel.items.value.count
5451
}
55-
52+
5653
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
5754
guard let cell = tableView.dequeueReusableCell(withIdentifier: MoviesListItemCell.reuseIdentifier, for: indexPath) as? MoviesListItemCell else {
58-
assertionFailure("Cannot dequeue reusable cell \(MoviesListItemCell.self) with reuseIdentifier: \(MoviesListItemCell.reuseIdentifier)")
59-
return .init()
55+
fatalError("Cannot dequeue reusable cell \(MoviesListItemCell.self) with reuseIdentifier: \(MoviesListItemCell.reuseIdentifier)")
6056
}
6157

62-
cell.fill(with: items[indexPath.row],
58+
cell.fill(with: viewModel.items.value[indexPath.row],
6359
posterImagesRepository: posterImagesRepository)
6460

65-
if indexPath.row == items.count - 1 {
61+
if indexPath.row == viewModel.items.value.count - 1 {
6662
viewModel.didLoadNextPage()
6763
}
68-
64+
6965
return cell
7066
}
71-
67+
7268
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
7369
return viewModel.isEmpty ? tableView.frame.height : super.tableView(tableView, heightForRowAt: indexPath)
7470
}
75-
71+
7672
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
7773
viewModel.didSelectItem(at: indexPath.row)
7874
}

ExampleMVVM/Presentation/MoviesScene/MoviesList/View/MoviesListViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ final class MoviesListViewController: UIViewController, StoryboardInstantiable,
4545
}
4646

4747
private func bind(to viewModel: MoviesListViewModel) {
48-
viewModel.items.observe(on: self) { [weak self] in self?.moviesTableViewController?.items = $0 }
48+
viewModel.items.observe(on: self) { [weak self] _ in self?.moviesTableViewController?.reload() }
4949
viewModel.query.observe(on: self) { [weak self] in self?.updateSearchController(query: $0) }
5050
viewModel.error.observe(on: self) { [weak self] in self?.showError($0) }
5151
viewModel.loadingType.observe(on: self) { [weak self] _ in self?.updateViewsVisibility() }

ExampleMVVM/Presentation/MoviesScene/MoviesList/ViewModel/MoviesListViewModel.swift

+6-8
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ final class DefaultMoviesListViewModel: MoviesListViewModel {
5858
let moviesPage: MoviesPage
5959
let items: [MoviesListItemViewModel]
6060
}
61-
private var pages: [Page] = []
61+
private var pages: [MoviesPage] = []
6262
private var moviesLoadTask: Cancellable? { willSet { moviesLoadTask?.cancel() } }
6363

6464
// MARK: - OUTPUT
@@ -88,11 +88,10 @@ final class DefaultMoviesListViewModel: MoviesListViewModel {
8888
totalPageCount = moviesPage.totalPages
8989

9090
pages = pages
91-
.filter { $0.moviesPage.page != moviesPage.page }
92-
+ [Page(moviesPage: moviesPage,
93-
items: moviesPage.movies.map(MoviesListItemViewModel.init))]
91+
.filter { $0.page != moviesPage.page }
92+
+ [moviesPage]
9493

95-
items.value = pages.items
94+
items.value = pages.movies.map(MoviesListItemViewModel.init)
9695
}
9796

9897
private func resetPages() {
@@ -168,7 +167,6 @@ extension DefaultMoviesListViewModel {
168167

169168
// MARK: - Private
170169

171-
private extension Array where Element == DefaultMoviesListViewModel.Page {
172-
var movies: [Movie] { flatMap { $0.moviesPage.movies } }
173-
var items: [MoviesListItemViewModel] { flatMap { $0.items } }
170+
private extension Array where Element == MoviesPage {
171+
var movies: [Movie] { flatMap { $0.movies } }
174172
}

ExampleMVVM/Presentation/Utils/Observable.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public final class Observable<Value> {
2626

2727
public func observe(on observer: AnyObject, observerBlock: @escaping (Value) -> Void) {
2828
observers.append(Observer(observer: observer, block: observerBlock))
29-
DispatchQueue.main.async { observerBlock(self.value) }
29+
observerBlock(self.value)
3030
}
3131

3232
public func remove(observer: AnyObject) {

0 commit comments

Comments
 (0)