Skip to content

Commit 6a2dfdb

Browse files
committed
Minor methods refactor
1 parent c6af656 commit 6a2dfdb

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ final class MoviesListTableViewController: UITableViewController {
2525
tableView.reloadData()
2626
}
2727

28-
func update(for loadingType: MoviesListViewModelLoading?) {
29-
switch loadingType {
28+
func updateLoading(_ loading: MoviesListViewModelLoading?) {
29+
switch loading {
3030
case .nextPage:
3131
nextPageLoadingSpinner?.removeFromSuperview()
3232
nextPageLoadingSpinner = UIActivityIndicatorView(style: .gray)

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

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,17 @@ final class MoviesListViewController: UIViewController, StoryboardInstantiable,
4040
}
4141

4242
private func bind(to viewModel: MoviesListViewModel) {
43-
viewModel.items.observe(on: self) { [weak self] _ in self?.moviesTableViewController?.reload() }
44-
viewModel.query.observe(on: self) { [weak self] in self?.updateSearchController(query: $0) }
45-
viewModel.error.observe(on: self) { [weak self] in self?.showError($0) }
46-
viewModel.loadingType.observe(on: self) { [weak self] in self?.updateViewsVisibility(loadingType: $0) }
43+
viewModel.items.observe(on: self) { [weak self] items in self?.updateItems(items) }
44+
viewModel.query.observe(on: self) { [weak self] query in self?.updateSearchQuery(query) }
45+
viewModel.loading.observe(on: self) { [weak self] loading in self?.updateLoading(loading) }
46+
viewModel.error.observe(on: self) { [weak self] error in self?.showError(error) }
4747
}
4848

4949
override func viewWillDisappear(_ animated: Bool) {
5050
super.viewWillDisappear(animated)
5151
searchController.isActive = false
5252
}
5353

54-
private func updateSearchController(query: String) {
55-
searchController.isActive = false
56-
searchController.searchBar.text = query
57-
}
58-
5954
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
6055
if segue.identifier == String(describing: MoviesListTableViewController.self),
6156
let destinationVC = segue.destination as? MoviesListTableViewController {
@@ -78,36 +73,45 @@ final class MoviesListViewController: UIViewController, StoryboardInstantiable,
7873
BlackStyleNavigationBarBehavior()])
7974
}
8075

81-
private func showError(_ error: String) {
82-
guard !error.isEmpty else { return }
83-
showAlert(title: viewModel.errorTitle, message: error)
76+
private func updateItems(_ items: [MoviesListItemViewModel]) {
77+
moviesTableViewController?.reload()
78+
}
79+
80+
private func updateSearchQuery(_ query: String) {
81+
searchController.isActive = false
82+
searchController.searchBar.text = query
8483
}
8584

86-
private func updateViewsVisibility(loadingType: MoviesListViewModelLoading?) {
85+
private func updateLoading(_ loading: MoviesListViewModelLoading?) {
8786
emptyDataLabel.isHidden = true
8887
moviesListContainer.isHidden = true
8988
suggestionsListContainer.isHidden = true
9089
LoadingView.hide()
9190

92-
switch loadingType {
91+
switch loading {
9392
case .fullScreen: LoadingView.show()
9493
case .nextPage: moviesListContainer.isHidden = false
9594
case .none:
9695
moviesListContainer.isHidden = viewModel.isEmpty
9796
emptyDataLabel.isHidden = !viewModel.isEmpty
9897
}
9998

100-
moviesTableViewController?.update(for: loadingType)
101-
updateQueriesSuggestionsVisibility()
99+
moviesTableViewController?.updateLoading(loading)
100+
updateQueriesSuggestions()
102101
}
103102

104-
private func updateQueriesSuggestionsVisibility() {
103+
private func updateQueriesSuggestions() {
105104
guard searchController.searchBar.isFirstResponder else {
106105
viewModel.closeQueriesSuggestions()
107106
return
108107
}
109108
viewModel.showQueriesSuggestions()
110109
}
110+
111+
private func showError(_ error: String) {
112+
guard !error.isEmpty else { return }
113+
showAlert(title: viewModel.errorTitle, message: error)
114+
}
111115
}
112116

113117
// MARK: - Search Controller
@@ -145,14 +149,14 @@ extension MoviesListViewController: UISearchBarDelegate {
145149

146150
extension MoviesListViewController: UISearchControllerDelegate {
147151
public func willPresentSearchController(_ searchController: UISearchController) {
148-
updateQueriesSuggestionsVisibility()
152+
updateQueriesSuggestions()
149153
}
150154

151155
public func willDismissSearchController(_ searchController: UISearchController) {
152-
updateQueriesSuggestionsVisibility()
156+
updateQueriesSuggestions()
153157
}
154158

155159
public func didDismissSearchController(_ searchController: UISearchController) {
156-
updateQueriesSuggestionsVisibility()
160+
updateQueriesSuggestions()
157161
}
158162
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protocol MoviesListViewModelInput {
3232

3333
protocol MoviesListViewModelOutput {
3434
var items: Observable<[MoviesListItemViewModel]> { get }
35-
var loadingType: Observable<MoviesListViewModelLoading?> { get }
35+
var loading: Observable<MoviesListViewModelLoading?> { get }
3636
var query: Observable<String> { get }
3737
var error: Observable<String> { get }
3838
var isEmpty: Bool { get }
@@ -60,7 +60,7 @@ final class DefaultMoviesListViewModel: MoviesListViewModel {
6060
// MARK: - OUTPUT
6161

6262
let items: Observable<[MoviesListItemViewModel]> = Observable([])
63-
let loadingType: Observable<MoviesListViewModelLoading?> = Observable(.none)
63+
let loading: Observable<MoviesListViewModelLoading?> = Observable(.none)
6464
let query: Observable<String> = Observable("")
6565
let error: Observable<String> = Observable("")
6666
var isEmpty: Bool { return items.value.isEmpty }
@@ -97,8 +97,8 @@ final class DefaultMoviesListViewModel: MoviesListViewModel {
9797
items.value.removeAll()
9898
}
9999

100-
private func load(movieQuery: MovieQuery, loadingType: MoviesListViewModelLoading) {
101-
self.loadingType.value = loadingType
100+
private func load(movieQuery: MovieQuery, loading: MoviesListViewModelLoading) {
101+
self.loading.value = loading
102102
query.value = movieQuery.query
103103

104104
moviesLoadTask = searchMoviesUseCase.execute(
@@ -111,7 +111,7 @@ final class DefaultMoviesListViewModel: MoviesListViewModel {
111111
case .failure(let error):
112112
self.handle(error: error)
113113
}
114-
self.loadingType.value = .none
114+
self.loading.value = .none
115115
})
116116
}
117117

@@ -123,7 +123,7 @@ final class DefaultMoviesListViewModel: MoviesListViewModel {
123123

124124
private func update(movieQuery: MovieQuery) {
125125
resetPages()
126-
load(movieQuery: movieQuery, loadingType: .fullScreen)
126+
load(movieQuery: movieQuery, loading: .fullScreen)
127127
}
128128
}
129129

@@ -134,9 +134,9 @@ extension DefaultMoviesListViewModel {
134134
func viewDidLoad() { }
135135

136136
func didLoadNextPage() {
137-
guard hasMorePages, loadingType.value == .none else { return }
138-
load(movieQuery: MovieQuery(query: query.value),
139-
loadingType: .nextPage)
137+
guard hasMorePages, loading.value == .none else { return }
138+
load(movieQuery: .init(query: query.value),
139+
loading: .nextPage)
140140
}
141141

142142
func didSearch(query: String) {

0 commit comments

Comments
 (0)