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=]] }
,电影就会放映。您应该问问自己,为什么您的端点只返回一部电影而不是一系列电影。
我是 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=]] }
,电影就会放映。您应该问问自己,为什么您的端点只返回一部电影而不是一系列电影。