У меня есть существующий и работающий код, который выглядит следующим образом (ненужные материалы удалены):
queryTextField.rx.text.orEmpty
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest { query in
return try AddFriendViewController.getSearchResults(query)
.retry(3)
.startWith([])
.catchErrorJustReturn([])
}
.bind(to: tableView.rx.items(cellIdentifier: "cell", cellType: AddFriendTableViewCell.self)) { (row, item, cell) in
cell.nameLabel.text = "\(item.firstName) \(item.lastName)"
}
.disposed(by: disposeBag)
Когда вы вводите имя в текстовое поле, он автоматически ищет (через API) друзей, соответствующих этому query.
Но я также хочу добавить еще одну функцию - импорт из контактов, вызываемый дополнительной кнопкой. У меня есть список локальных контактов, и с их помощью я спрашиваю API о результатах поиска. Я хочу отобразить эти результаты в одном и том же месте. Но я не знаю, как отправить эти результаты в tableView. Я думал о создании переменной:
var items: Observable<[FriendSearchResult]> = Observable.just([])
Но я не знаю, как отправлять / получать данные. Есть какие-нибудь подсказки?
edit:
Благодаря @andromedainative теперь код выглядит так:
var items: BehaviorRelay<[FriendSearchResult]> = BehaviorRelay(value: [])
items.asObservable()
.bind(to: tableView.rx.items(cellIdentifier: "cell", cellType: AddFriendTableViewCell.self)) { (row, item, cell) in
cell.nameLabel.text = "\(item.firstName) \(item.lastName)"
}
.disposed(by: disposeBag)
queryTextField.rx.text.orEmpty
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.distinctUntilChanged()
.flatMapLatest { query in
return try AddFriendViewController.getSearchResults(query)
.retry(3)
.startWith([])
.catchErrorJustReturn([])
}
.bind(to: items) //this was a missing piece
.disposed(by: disposeBag)
И передать результаты из getContacts просто:
items.accept(data)
Но у меня есть особый случай, когда мне нужно обновить данные sh. Как я могу вызвать queryTextField для вызова API с тем же запросом?
Я нашел только один хакерский способ:
let query = queryTextField.text ?? ""
queryTextField.text = ""
queryTextField.sendActions(for: .valueChanged)
queryTextField.text = query
queryTextField.sendActions(for: .valueChanged)
Мне нужно изменить какое-то другое значение и вернуть его обратно. Есть ли еще чистый раствор?