gpt4 book ai didi

ios - RxCocoa-observable 正在从 API 发出新数据,但 tableview.rx.items 不显示新数据

转载 作者:行者123 更新时间:2023-11-28 19:26:50 26 4
gpt4 key购买 nike

我是 RxSwift 和 RxCocoa 的新手。

我在本地有一个可用的 REST 服务,它返回给定“id”的 Movie 对象。

在我的 Storyboard上有一个 tableView (UITableView),它有自定义单元格 (MovieCell)。每个电影单元格都有一个名为“nameTextLabel”的 UILabel。我还有一个 textField 来获取用户请求的 movie.id。

我试图在我的 tableView 的每一行上显示 movie.title。

import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {

@IBOutlet var textField: UITextField!
@IBOutlet var tableView: UITableView!
let bag = DisposeBag()

override func viewDidLoad() {
super.viewDidLoad()
configureReactiveBinding()
}
private func configureReactiveBinding() {
textField.rx.text.asObservable()
.map { ($0 == "" ? "15" : $0!).lowercased() }
.map { GetMovieByIdRequest(id: $0) }
.flatMap { request -> Observable<Movie> in
return ServiceManager.instance.send(apiRequest: request)
}
.debug("movie")
// output:
//2018-10-17 16:13:49.320: movie -> subscribed
//2018-10-17 16:13:49.401: movie -> Event next(MovieAdvisor.Movie)
//2018-10-17 16:13:52.021: movie -> Event next(MovieAdvisor.Movie)
.toArray()
.debug("tableView")
// output:
//2018-10-17 16:13:49.318: tableView -> subscribed

.bind(to: tableView.rx.items(cellIdentifier: "movie_cell", cellType:MovieCell.self)) { index, model, cell in
cell.nameTextLabel.text = model.title
}
.disposed(by: bag)
}

}

每次更改 textLabel 时都会打印新的 movie.id,但 tableView 不显示任何数据 - 甚至不显示初始值(当 textField 为“”时)。

知道我该如何解决这个问题吗?

添加 debug() 行后,我发现 tableView 只被订阅了一次,并且没有下一个事件触发 tableView。我应该怎么办?代码已上传至 GitHub github

最佳答案

问题是您的 toArray() 运算符。该运算符等待序列完成,然后将整个序列作为单个数组发出。在您退出 View Controller 之前,您的序列不会完成。

将其替换为 .map { [$0] } 即可显示电影。您应该问问自己,为什么您的端点只返回一部电影而不是一系列电影。

关于ios - RxCocoa-observable 正在从 API 发出新数据,但 tableview.rx.items 不显示新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52852137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com