【发布时间】:2020-01-23 08:17:11
【问题描述】:
我有现有的工作代码,看起来像这样(删除了不必要的东西):
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)匹配此查询的朋友。
但我还想添加另一个功能 - 从联系人导入,由附加按钮调用。我有一个本地联系人列表,并使用它们向 API 询问搜索结果。我想在同一个地方显示这些结果。但我不知道如何将这些结果发送到 tableView 中。我想创建一个变量:
var items: Observable<[FriendSearchResult]> = Observable.just([])
但我不知道如何发送/接收数据。有什么线索吗?
编辑:
感谢@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)
但是,我有一个特殊情况,我必须刷新数据。如何调用 queryTextField 来调用同一个查询的 API?
我只找到了一个 hacky 方法:
let query = queryTextField.text ?? ""
queryTextField.text = ""
queryTextField.sendActions(for: .valueChanged)
queryTextField.text = query
queryTextField.sendActions(for: .valueChanged)
我必须更改为其他值并将其更改回来。有没有更干净的解决方案?
【问题讨论】:
标签: ios swift reactive-programming rx-swift