From 053c08443bc6fa36b976b35e86cb95f87c9304b3 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 27 Mar 2019 13:52:38 +0300 Subject: [PATCH] Fixes --- LeadKit.xcodeproj/project.pbxproj | 32 +++++++++++++++++++ .../Search/BaseSearchViewController.swift | 8 +++-- .../Classes/Search/BaseSearchViewModel.swift | 14 ++++---- iOS.playground/Contents.swift | 2 -- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/LeadKit.xcodeproj/project.pbxproj b/LeadKit.xcodeproj/project.pbxproj index 96f56f7f..7abae4ce 100644 --- a/LeadKit.xcodeproj/project.pbxproj +++ b/LeadKit.xcodeproj/project.pbxproj @@ -470,6 +470,10 @@ 7295473F21E661E6009558E7 /* TitleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7295473E21E661E6009558E7 /* TitleType.swift */; }; 7295474221E6628C009558E7 /* UINavigationItem+Support.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7295474121E6628C009558E7 /* UINavigationItem+Support.swift */; }; 7295474421E66328009558E7 /* UIViewController+UpdateNavigationItemTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7295474321E66328009558E7 /* UIViewController+UpdateNavigationItemTitle.swift */; }; + 72AECC6B224A979D00D12E7C /* BaseSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72AECC69224A979D00D12E7C /* BaseSearchViewController.swift */; }; + 72AECC6C224A979D00D12E7C /* BaseSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72AECC6A224A979D00D12E7C /* BaseSearchViewModel.swift */; }; + 72AECC6F224A97B100D12E7C /* SearchResultsViewControllerState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72AECC6E224A97B100D12E7C /* SearchResultsViewControllerState.swift */; }; + 72AECC71224A97F100D12E7C /* SearchResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72AECC70224A97F000D12E7C /* SearchResultsViewController.swift */; }; 785EDF7C220072B500985ED4 /* SwiftDate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 785EDF76220072B400985ED4 /* SwiftDate.framework */; }; 785EDF7D220072B500985ED4 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 785EDF77220072B400985ED4 /* RxCocoa.framework */; }; 785EDF7E220072B500985ED4 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 785EDF78220072B500985ED4 /* Alamofire.framework */; }; @@ -764,6 +768,10 @@ 7295473E21E661E6009558E7 /* TitleType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleType.swift; sourceTree = ""; }; 7295474121E6628C009558E7 /* UINavigationItem+Support.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationItem+Support.swift"; sourceTree = ""; }; 7295474321E66328009558E7 /* UIViewController+UpdateNavigationItemTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+UpdateNavigationItemTitle.swift"; sourceTree = ""; }; + 72AECC69224A979D00D12E7C /* BaseSearchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseSearchViewController.swift; sourceTree = ""; }; + 72AECC6A224A979D00D12E7C /* BaseSearchViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseSearchViewModel.swift; sourceTree = ""; }; + 72AECC6E224A97B100D12E7C /* SearchResultsViewControllerState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchResultsViewControllerState.swift; sourceTree = ""; }; + 72AECC70224A97F000D12E7C /* SearchResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchResultsViewController.swift; sourceTree = ""; }; 785EDF76220072B400985ED4 /* SwiftDate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftDate.framework; path = Carthage/Build/iOS/SwiftDate.framework; sourceTree = ""; }; 785EDF77220072B400985ED4 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/iOS/RxCocoa.framework; sourceTree = ""; }; 785EDF78220072B500985ED4 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/iOS/Alamofire.framework; sourceTree = ""; }; @@ -887,6 +895,7 @@ isa = PBXGroup; children = ( 6741CEC520E2434900FEC4D9 /* Controllers */, + 72AECC68224A979D00D12E7C /* Search */, 6774527E2062566D0024EEEF /* DataLoading */, 671461D21EB3396E00EAB194 /* Services */, 671461D41EB3396E00EAB194 /* Views */, @@ -946,6 +955,7 @@ isa = PBXGroup; children = ( 67274767206CCB6F00725163 /* Views */, + 72AECC6D224A97B100D12E7C /* Search */, 6774528A20625C860024EEEF /* DataLoading */, 671461D81EB3396E00EAB194 /* LeadKitError.swift */, 671461D91EB3396E00EAB194 /* ResizeMode.swift */, @@ -1459,6 +1469,7 @@ isa = PBXGroup; children = ( 671462241EB3396E00EAB194 /* ConfigurableController.swift */, + 72AECC70224A97F000D12E7C /* SearchResultsViewController.swift */, ); path = Controllers; sourceTree = ""; @@ -1939,6 +1950,23 @@ path = TableKitViewModel; sourceTree = ""; }; + 72AECC68224A979D00D12E7C /* Search */ = { + isa = PBXGroup; + children = ( + 72AECC69224A979D00D12E7C /* BaseSearchViewController.swift */, + 72AECC6A224A979D00D12E7C /* BaseSearchViewModel.swift */, + ); + path = Search; + sourceTree = ""; + }; + 72AECC6D224A97B100D12E7C /* Search */ = { + isa = PBXGroup; + children = ( + 72AECC6E224A97B100D12E7C /* SearchResultsViewControllerState.swift */, + ); + path = Search; + sourceTree = ""; + }; 785EDF75220072B400985ED4 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -2423,6 +2451,7 @@ 67EB7FF8206175F700BDD9FB /* PaginationWrappable.swift in Sources */, 67990AD6213EA6A50040D195 /* ContentLoadingViewModel+Extensions.swift in Sources */, 671463541EB3396E00EAB194 /* StaticViewHeightProtocol.swift in Sources */, + 72AECC6B224A979D00D12E7C /* BaseSearchViewController.swift in Sources */, 673CF4112063ABD100C329F6 /* GeneralDataLoadingState+Extensions.swift in Sources */, 673CF42C2063DE5900C329F6 /* TextPlaceholderView.swift in Sources */, 67ED2BDE20B44DEB00508B3E /* InitializableView.swift in Sources */, @@ -2482,6 +2511,7 @@ 6741CEB420E242C100FEC4D9 /* CollectionViewHolder+ScrollViewHolder.swift in Sources */, A676AE501F9810C1001F9214 /* Any+Cast.swift in Sources */, 78EC7B1322019F5A0007DCFD /* String+TelpromptURL.swift in Sources */, + 72AECC6F224A97B100D12E7C /* SearchResultsViewControllerState.swift in Sources */, 6714627C1EB3396E00EAB194 /* SessionManager+Extensions.swift in Sources */, 671462D41EB3396E00EAB194 /* TableDirector+Extensions.swift in Sources */, 67E352572119ACF30035BDDB /* ViewTextConfigurable+Extensions.swift in Sources */, @@ -2507,6 +2537,7 @@ B84CB06D20B8325D0090DB91 /* SessionManager.swift in Sources */, A658E5501F8CD9350093527A /* Array+SeparatorRowBoxExtensions.swift in Sources */, 673564F12068C2AD00F0CBED /* NumberFormattingService+DefaultImplementation.swift in Sources */, + 72AECC6C224A979D00D12E7C /* BaseSearchViewModel.swift in Sources */, 7295474221E6628C009558E7 /* UINavigationItem+Support.swift in Sources */, 7295474421E66328009558E7 /* UIViewController+UpdateNavigationItemTitle.swift in Sources */, 671462EC1EB3396E00EAB194 /* UIImage+Extensions.swift in Sources */, @@ -2597,6 +2628,7 @@ 6714629C1EB3396E00EAB194 /* CursorType+Slice.swift in Sources */, 6774529F20625EEE0024EEEF /* PaginationDataLoadingModel.swift in Sources */, 678D267920691D8200B05B93 /* DataModelFieldBinding.swift in Sources */, + 72AECC71224A97F100D12E7C /* SearchResultsViewController.swift in Sources */, 673CF4342063E29B00C329F6 /* TextWithButtonPlaceholder.swift in Sources */, 673CF4222063D90600C329F6 /* DisposeBagHolder.swift in Sources */, 67DB776D210871E8001CB56B /* BaseCollectionContentController.swift in Sources */, diff --git a/Sources/Classes/Search/BaseSearchViewController.swift b/Sources/Classes/Search/BaseSearchViewController.swift index e9b96d5f..2e170cc1 100644 --- a/Sources/Classes/Search/BaseSearchViewController.swift +++ b/Sources/Classes/Search/BaseSearchViewController.swift @@ -46,6 +46,7 @@ where ViewModel: BaseSearchViewModel { self.searchResultsController = searchResultsController self.searchController = UISearchController(searchResultsController: searchResultsController) super.init(viewModel: viewModel) + initialLoadView() } required public init?(coder aDecoder: NSCoder) { @@ -56,7 +57,6 @@ where ViewModel: BaseSearchViewModel { open override func bindViews() { super.bindViews() - viewModel.itemsViewModelsDriver .drive(onNext: { [weak self] viewModels in self?.handle(itemViewModels: viewModels) @@ -93,8 +93,8 @@ where ViewModel: BaseSearchViewModel { open override func configureAppearance() { super.configureAppearance() - definesPresentationContext = true + configureSearchBarAppearance(searchController.searchBar) customView.tableView.tableHeaderView?.backgroundColor = searchBarColor } @@ -183,6 +183,10 @@ where ViewModel: BaseSearchViewModel { /// override in subclass return .zero } + + open func configureSearchBarAppearance(_ searchBar: UISearchBar) { + // override in subclass + } } extension BaseSearchViewController { diff --git a/Sources/Classes/Search/BaseSearchViewModel.swift b/Sources/Classes/Search/BaseSearchViewModel.swift index e9e5cdc3..b550fae7 100644 --- a/Sources/Classes/Search/BaseSearchViewModel.swift +++ b/Sources/Classes/Search/BaseSearchViewModel.swift @@ -44,8 +44,12 @@ open class BaseSearchViewModel: GeneralDataLoadingViewModel .asDriver(onErrorDriveWith: .empty()) } + open var searchDebounceInterval: RxTimeInterval { + return 1 + } + open var searchResultsDriver: Driver<[ItemViewModel]> { - return searchTextRelay.throttle(1, scheduler: MainScheduler.instance) + return searchTextRelay.debounce(searchDebounceInterval, scheduler: MainScheduler.instance) .withLatestFrom(loadingResultObservable) { ($0, $1) } .flatMapLatest { [weak self] searchText, items -> Observable in self?.search(by: searchText, from: items).asObservable() ?? .empty() @@ -70,10 +74,6 @@ open class BaseSearchViewModel: GeneralDataLoadingViewModel return searchText.bind(to: searchTextRelay) } - open func onDidSelect(item: Item) { - // override in subclass - } - private func viewModels(from items: ItemsList) -> [ItemViewModel] { return items.map { self.viewModel(from: $0) } } @@ -82,14 +82,14 @@ open class BaseSearchViewModel: GeneralDataLoadingViewModel return loadingStateDriver .asObservable() .map { $0.result } - .filterNil() + .flatMap { Observable.from(optional: $0) } } open var loadingErrorObservable: Observable { return loadingStateDriver .asObservable() .map { $0.error } - .filterNil() + .flatMap { Observable.from(optional: $0) } } open var firstLoadingResultObservable: Single { diff --git a/iOS.playground/Contents.swift b/iOS.playground/Contents.swift index 2a779426..8b137891 100644 --- a/iOS.playground/Contents.swift +++ b/iOS.playground/Contents.swift @@ -1,3 +1 @@ -import LeadKit -let str = "Hello, LeadKit playground"