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

RxCocoa-observable is emitting new data from API but tableview.rx.items doesn't show new data

我是 RxSwift 和 RxCocoa 的新手。

我在本地有一个可用的 REST 服务,returns 给定 "id" 的 Movie 对象。

在我的情节提要板上有一个带有自定义单元格 (MovieCell) 的 tableView (UITableView)。每个电影单元格都有一个名为 "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 { ([=12=] == "" ? "15" : [=12=]!).lowercased() }
        .map { GetMovieByIdRequest(id: [=12=]) }
        .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

尝试替换

`a.subscribe(onNext: {movie in
    print(movie.title)
})
.disposed(by: bag)

.observeOn(MainScheduler.instance) 一起看看是否有效。

也许 .toArray() 直接移到 ServiceManager.instance.send(apiRequest: request) 之后。

您也可以在每个 RxSwift 运算符后添加 *.debug("my custom message")* 以查看它是否被执行。

顺便说一句,我建议为此使用 RxDataSources 框架,而不是裸露的 RxCocoa。

问题出在您的 toArray() 接线员身上。该运算符等待序列 完成 ,然后将整个序列作为单个数组发出。在您退出视图控制器之前,您的序列不会完成。

将其替换为 .map { [[=11=]] },电影就会放映。您应该问问自己,为什么您的端点只返回一部电影而不是一系列电影。