0

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

}

Country 有一个属性“城市”,它是一组城市。

@solidcell 你一定是对的,如果我在 toArray() 之前和之后放置 debug(),我会得到 2 个订阅,每个 debug() 一个,每个数组项的 1 个 next 事件仅用于之前的 toArray() debug()。

但是,为什么它没有完成呢?

4

1 回答 1

0

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

试着.debug()在里面放一个,看看你是否能发现是不是因为城市的 Observable 没有完成。

于 2016-05-24T20:54:48.567 回答