如何使用 RxSwift 将一种类型的 Observable 数组转换为另一种类型的 Observable 数组
How to convert Observable array of a type to Observable array of a different type with RxSwift
我是 RxSwift 的新手,我遇到了下一个情况:
self.viewModel!.country
.flatMapLatest { country -> Observable<City> in
country!.cities!.toObservable()
}
.map { city -> SectionModel<String, String> in
SectionModel(model: city.name!, items: city.locations!)
}
.toArray()
.bindTo(self.tableView.rx_itemsWithDataSource(dataSource))
.addDisposableTo(self.disposeBag)
在我看来 toArray() 什么都不做,我不知道为什么。另一方面,这段代码做我想做的。我想知道为什么以前的代码不能以同样的方式工作:
self.viewModel!.country
.flatMapLatest { country -> Observable<[SectionModel<String, String>]> in
var models = [SectionModel<String, String>]()
for city in country!.cities! {
models.append(SectionModel(model: city.name!, items: city.locations!))
}
return Observable.just(models)
}
.bindTo(self.tableView.rx_itemsWithDataSource(dataSource))
.addDisposableTo(self.disposeBag)
提前致谢。
编辑:
视图模型实现如下:
class LocationViewModel {
let country = BehaviorSubject<Country?>(value: nil)
}
国家/地区有一个 属性 'cities',它是一个城市数组。
@solidcell 你一定是对的,如果我在 toArray() 之前和之后放置 debug(),我会得到 2 个订阅,每个 debug() 一个,每个数组项的 1 个下一个事件仅在 toArray( ) 调试().
但是,为什么它没有完成?
可能是因为 country!.cities
某些国家/地区没有终止。在 Observable
完成之前,toArray()
不会发出任何元素。只有在 Observable
完成后,它才会将所有元素打包为一个元素作为 Array
。但是,我不能确定这是否是您的问题,因为我不知道您是如何实施 country!.cities
.
尝试在其中放置一个 .debug()
,看看您是否可以发现这是不是因为城市的 Observable 未完成。
我是 RxSwift 的新手,我遇到了下一个情况:
self.viewModel!.country
.flatMapLatest { country -> Observable<City> in
country!.cities!.toObservable()
}
.map { city -> SectionModel<String, String> in
SectionModel(model: city.name!, items: city.locations!)
}
.toArray()
.bindTo(self.tableView.rx_itemsWithDataSource(dataSource))
.addDisposableTo(self.disposeBag)
在我看来 toArray() 什么都不做,我不知道为什么。另一方面,这段代码做我想做的。我想知道为什么以前的代码不能以同样的方式工作:
self.viewModel!.country
.flatMapLatest { country -> Observable<[SectionModel<String, String>]> in
var models = [SectionModel<String, String>]()
for city in country!.cities! {
models.append(SectionModel(model: city.name!, items: city.locations!))
}
return Observable.just(models)
}
.bindTo(self.tableView.rx_itemsWithDataSource(dataSource))
.addDisposableTo(self.disposeBag)
提前致谢。
编辑:
视图模型实现如下:
class LocationViewModel {
let country = BehaviorSubject<Country?>(value: nil)
}
国家/地区有一个 属性 'cities',它是一个城市数组。
@solidcell 你一定是对的,如果我在 toArray() 之前和之后放置 debug(),我会得到 2 个订阅,每个 debug() 一个,每个数组项的 1 个下一个事件仅在 toArray( ) 调试().
但是,为什么它没有完成?
可能是因为 country!.cities
某些国家/地区没有终止。在 Observable
完成之前,toArray()
不会发出任何元素。只有在 Observable
完成后,它才会将所有元素打包为一个元素作为 Array
。但是,我不能确定这是否是您的问题,因为我不知道您是如何实施 country!.cities
.
尝试在其中放置一个 .debug()
,看看您是否可以发现这是不是因为城市的 Observable 未完成。