Skip to content

Instantly share code, notes, and snippets.

@olgusirman
Created June 2, 2018 12:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save olgusirman/ec6e99221c3f9d0f332e8016a570f04d to your computer and use it in GitHub Desktop.
Save olgusirman/ec6e99221c3f9d0f332e8016a570f04d to your computer and use it in GitHub Desktop.
UISearchBar - Search with RxSwift Example
final class SampleRxSearchViewController: UIViewController {
// MARK: - Properties
@IBOutlet fileprivate weak var tableView: UITableView!
@IBOutlet fileprivate weak var searchBar: UISearchBar!
fileprivate var tweets = [Tweet]()
fileprivate var filteredTweets = [Tweet]()
// MARK - Lifecycle
fileprivate let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
configureSearch()
}
fileprivate func configureSearch() {
searchBar.rx.text
.orEmpty
.throttle(1.0, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe { [unowned self] (query) in
self.filteredTweets = self.tweets.search(query: query)
self.tableView.reloadData()
}.disposed(by: disposeBag)
}
}
extension String {
func search(_ term: String) -> Bool {
let lowercasedSelf = self.lowercased()
let lowercasedTerm = term.lowercased()
return lowercasedSelf.localizedCaseInsensitiveContains(lowercasedTerm)
}
}
extension Array where Element: Tweet {
func search(query: Event<String>) -> [Element] {
return self.filter({
guard let text = $0.text, let queryElement = query.element else { return false }
return text.search(queryElement)
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment