使用RxSwift将Alamofire请求绑定到表视图
所以我已经研究了几天RxSwift,并试图用它创建一个简单的应用程序。我已将表的searchController绑定到结果,这些结果将馈送到使用RxSwift将Alamofire请求绑定到表视图,swift,uitableview,rx-swift,rxalamofire,Swift,Uitableview,Rx Swift,Rxalamofire,所以我已经研究了几天RxSwift,并试图用它创建一个简单的应用程序。我已将表的searchController绑定到结果,这些结果将馈送到cellForRowAt函数中。如何将alamofire响应绑定到每个单元格? 我需要做以下哪一项 使用RxAlamofire创建searchResultsArray 将searchResultsArray更改为变量,并使用可观察 绑定response或searchResultsArray以创建每个单元格 我需要使用的功能是: .bind(to: sel
cellForRowAt
函数中。如何将alamofire响应绑定到每个单元格?
我需要做以下哪一项
- 使用RxAlamofire创建searchResultsArray
- 将searchResultsArray更改为
,并使用变量
可观察
- 绑定
或response
以创建每个单元格searchResultsArray
.bind(to: self.tableView.rx.items(cellIdentifier: "cell", cellType: UITableViewCell.self)) { row, element, cell in
cell.textLabel?.text = "something"
}
这是我当前的RxSwift代码:
let disposeBag = DisposeBag()
var searchResultsArray = [[String:String]]()
searchController.searchBar.rx.text.orEmpty.filter { text in
text.count >= 3
}.subscribe(onNext: { text in
searchRequest(search: text, searchType: "t:t") { response in
self.searchResultsArray = response
self.tableView.reloadData()
}
}).disposed(by: disposeBag)
这是我当前的单元格创建函数<单击“取消”按钮时,代码>显示搜索结果会更改
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UITableViewCell = {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") else {
return UITableViewCell(style: .subtitle, reuseIdentifier: "cell")
}
return cell
}()
if self.shouldShowSearchResults {
cell.textLabel?.text = searchResultsArray[indexPath.row]["result"]!
cell.detailTextLabel?.text = searchResultsArray[indexPath.row]["location"]!
}
return cell
}
这是我当前的api请求:
func searchRequest(search: String, searchType: String, completionHandler: @escaping ([[String: String]]) -> ()) {
let payload: [String: Any] = [
"q": search,
"fq": searchType,
"start": 0
]
let url = URL(string: "https://www.athletic.net/Search.aspx/runSearch")!
Alamofire.request(url, method: .post, parameters: payload, encoding: JSONEncoding.default).responseJSON { response in
let json = response.data
do {
var searchResults: [[String: String]] = []
let parsedJson = JSON(json!)
if let doc = try? Kanna.HTML(html: parsedJson["d"]["results"].stringValue, encoding: .utf8) {
for row in doc.css("td:nth-child(2)") {
let link = row.at_css("a.result-title-tf")!
let location = row.at_css("a[target=_blank]")!
let schoolID = link["href"]!.components(separatedBy: "=")[1]
searchResults.append(["location": location.text!, "result": link.text!, "id":schoolID])
}
}
completionHandler(searchResults)
} catch let error {
print(error)
}
}
}
我想用RxSwift解决方案替换cellForRowAt。根据您提供的代码,使用Rx将为您提供如下信息:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchBar.rx.text.orEmpty
.filter { text in text.count >= 3 }
.flatMapLatest { text in searchRequest(search: text, searchType: "t:t") }
.bind(to: self.tableView.rx.items(cellIdentifier: "cell", cellType: UITableViewCell.self)) { row, element, cell in
if self.shouldShowSearchResults {
cell.textLabel?.text = element["result"]!
cell.detailTextLabel?.text = element["location"]!
}
}
.disposed(by: disposeBag)
}
func searchRequest(search: String, searchType: String) -> Observable<[[String: String]]> {
return Observable.create { observer in
searchRequest(search: search, searchType: searchType, completionHandler: { result in
observer.onNext(result)
observer.onCompleted()
})
return Disposables.create()
}
}
应该显示搜索结果
在这种情况下感觉不合适。但在其他方面看起来不错
以上假设您将searchRequest封装在一个函数中,该函数返回如下可观察值:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchBar.rx.text.orEmpty
.filter { text in text.count >= 3 }
.flatMapLatest { text in searchRequest(search: text, searchType: "t:t") }
.bind(to: self.tableView.rx.items(cellIdentifier: "cell", cellType: UITableViewCell.self)) { row, element, cell in
if self.shouldShowSearchResults {
cell.textLabel?.text = element["result"]!
cell.detailTextLabel?.text = element["location"]!
}
}
.disposed(by: disposeBag)
}
func searchRequest(search: String, searchType: String) -> Observable<[[String: String]]> {
return Observable.create { observer in
searchRequest(search: search, searchType: searchType, completionHandler: { result in
observer.onNext(result)
observer.onCompleted()
})
return Disposables.create()
}
}
func searchRequest(search:String,searchType:String)->可观察{
返回可观察的。在中创建{observer
searchRequest(搜索:搜索,搜索类型:搜索类型,completionHandler:{结果为
observer.onNext(结果)
observer.onCompleted()
})
返回一次性物品。创建()
}
}
以上是一种标准模式,它将使用回调的函数包装为返回可观察的函数。根据您提供的代码,使用Rx将得到如下结果:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchBar.rx.text.orEmpty
.filter { text in text.count >= 3 }
.flatMapLatest { text in searchRequest(search: text, searchType: "t:t") }
.bind(to: self.tableView.rx.items(cellIdentifier: "cell", cellType: UITableViewCell.self)) { row, element, cell in
if self.shouldShowSearchResults {
cell.textLabel?.text = element["result"]!
cell.detailTextLabel?.text = element["location"]!
}
}
.disposed(by: disposeBag)
}
func searchRequest(search: String, searchType: String) -> Observable<[[String: String]]> {
return Observable.create { observer in
searchRequest(search: search, searchType: searchType, completionHandler: { result in
observer.onNext(result)
observer.onCompleted()
})
return Disposables.create()
}
}
应该显示搜索结果
在这种情况下感觉不合适。但在其他方面看起来不错
以上假设您将searchRequest封装在一个函数中,该函数返回如下可观察值:
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchBar.rx.text.orEmpty
.filter { text in text.count >= 3 }
.flatMapLatest { text in searchRequest(search: text, searchType: "t:t") }
.bind(to: self.tableView.rx.items(cellIdentifier: "cell", cellType: UITableViewCell.self)) { row, element, cell in
if self.shouldShowSearchResults {
cell.textLabel?.text = element["result"]!
cell.detailTextLabel?.text = element["location"]!
}
}
.disposed(by: disposeBag)
}
func searchRequest(search: String, searchType: String) -> Observable<[[String: String]]> {
return Observable.create { observer in
searchRequest(search: search, searchType: searchType, completionHandler: { result in
observer.onNext(result)
observer.onCompleted()
})
return Disposables.create()
}
}
func searchRequest(search:String,searchType:String)->可观察{
返回可观察的。在中创建{observer
searchRequest(搜索:搜索,搜索类型:搜索类型,completionHandler:{结果为
observer.onNext(结果)
observer.onCompleted()
})
返回一次性物品。创建()
}
}
以上是一个标准模式,它将使用回调的函数包装成一个返回
可观察的
的函数,这太棒了!对我来说,用一个可观察的对象替换闭包更好吗?我该怎么做呢?我希望RxAlamofire已经编写了包装器,但我通常不使用alamofire,所以我不确定。您可能还喜欢查看这个示例程序。我很乐意回答您关于它的任何问题,只要发布一个问题和一个问题,我就会回答。如果它返回一个可观察的值呢?表视图需要一个对象数组。这太棒了!对我来说,用一个可观察的对象替换闭包更好吗?我该怎么做呢?我希望RxAlamofire已经编写了包装器,但我通常不使用alamofire,所以我不确定。您可能还喜欢查看这个示例程序。我很乐意回答您关于它的任何问题,只要发布一个问题和一个问题,我就会回答。如果它返回一个可观察的值呢?表视图需要一个对象数组。