如何使用RxSwift将类型的Observable数组转换为不同类型的Observable数组

时间:2016-05-24 18:45:03

标签: ios swift rx-swift reactivex

我是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)

对我来说似乎就像阿雷()没有做什么,我不知道为什么。另一方面,这段代码完成了我想要的。我想知道为什么以前的代码不能以相同的方式工作:

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)

}

国家/地区有一个属于'城市'的房产,是一系列城市。

@solidcell你必须是正确的,如果我在toArray()之前和之后放置debug()我得到2个订阅,每个debug()一个,每个数组项只有1个下一个事件,仅用于before toArray()调试()。

但是,为什么不完成呢?

1 个答案:

答案 0 :(得分:0)

这可能是因为某些国家的country!.cities没有终止。在toArray()完成之前,Observable不会发出任何元素。只有Observable完成后才会将所有元素打包为一个元素Array。但是,我不能确定这是否是您的问题,因为我不知道您是如何实施的country!.cities

尝试在其中放置一个.debug(),看看是否可以发现是否是因为Observable of cities尚未完成。