@@ -26,55 +26,63 @@ class RepositoriesViewController: UIViewController {
2626 override func viewDidLoad( ) {
2727 super. viewDidLoad ( )
2828
29- viewModel = RepositoriesViewModel ( search : searchBar . rx . text . orEmpty , service: RepositoriesService ( ) )
29+ viewModel = RepositoriesViewModel ( service: RepositoriesService ( ) )
3030
31- doDriving ( )
31+ doBindings ( )
3232 }
3333
34- override func didReceiveMemoryWarning( ) {
35- super. didReceiveMemoryWarning ( )
36- // Dispose of any resources that can be recreated.
37- }
34+ func doBindings( ) {
35+ // Inputs
36+ searchBar. rx. text. orEmpty. changed
37+ . bind ( to: viewModel. search)
38+ . disposed ( by: disposeBag)
39+
40+ tableView. rx. contentOffset
41+ . flatMap { [ unowned self] state in
42+ return self . tableView. isNearBottomEdge ( edgeOffset: 20.0 )
43+ ? Signal . just ( ( ) )
44+ : Signal . empty ( )
45+ }
46+ . bind ( to: viewModel. loadMore)
47+ . disposed ( by: disposeBag)
3848
39- func doDriving( ) {
40- viewModel. repositoriesState
41- . map { $0. data ?? [ ] }
42- . drive ( tableView. rx. items ( cellIdentifier: " cell " ) ) { _, element, cell in
49+ // Outputs
50+ viewModel. repositories
51+ . bind ( to: tableView. rx. items ( cellIdentifier: " cell " ) ) { _, element, cell in
4352 cell. textLabel? . text = element. name
4453 cell. detailTextLabel? . text = element. description
4554 }
4655 . disposed ( by: disposeBag)
4756
48- viewModel. repositoriesState
49- . map { $0. state ? . validationProblem }
57+ viewModel. baseState
58+ . map { $0. validationProblem }
5059 . filterNil ( )
5160 . map { _ in " Please enter any search query " }
52- . drive ( errorText)
61+ . bind ( to : errorText)
5362 . disposed ( by: disposeBag)
5463
55- viewModel. repositoriesState
56- . map { $0. state ? . forbidden }
64+ viewModel. baseState
65+ . map { $0. forbidden }
5766 . filterNil ( )
5867 . map { _ in " You have exceed API limit " }
59- . drive ( errorText)
68+ . bind ( to : errorText)
6069 . disposed ( by: disposeBag)
6170
62- viewModel. repositoriesState
63- . map { $0. data }
64- . filterNil ( )
65- . filter { $0. isEmpty }
71+ viewModel. repositories
72+ . withLatestFrom ( viewModel. baseState) { $0. isEmpty && $1. isSuccess }
73+ . filter { $0 }
6674 . map { _ in " Unable to find repo with this search query " }
67- . drive ( errorText)
75+ . bind ( to : errorText)
6876 . disposed ( by: disposeBag)
6977
70- viewModel. repositoriesState
71- . map { $0. data? . isNotEmpty ?? false }
72- . filter { $0 }
78+ viewModel. repositories
79+ . filter { $0. isNotEmpty }
7380 . map { _ in nil }
74- . drive ( errorText)
81+ . bind ( to : errorText)
7582 . disposed ( by: disposeBag)
7683
7784 errorText
85+ . observeOn ( MainScheduler . instance)
7886 . subscribe ( onNext: { [ tableView] msg in
7987 guard let msg = msg else {
8088 tableView? . backgroundView = nil
0 commit comments