如何使用 RxSwift 的 Groupby 运算符将 GroupedObservable<String, Message> 转换为 SectionModel<String, Message>?

How to transform GroupedObservable<String, Message> to SectionModel<String, Message> using Groupby operator of RxSwift?

我想将日期显示为部分标题并根据日期对邮件进行分组。 我想使用 RxDatasource 库,但无法创建 SectionModel 以直接提供给数据源。

let source = sut.results.asObservable().map { result -> Observable<Message> in
    switch result {
    case .success(let messages):
        return Observable.from(messages)
    default:
        break
    }
    return Observable.from([Message]())
    }
    .flatMap { [=12=] }

let group = source.groupBy { [=12=].date.dateOnly }
group.subscribe(onNext: {
   print([=12=])
}).disposed(by: disposeBag)

下面是我在日志中得到的输出:

GroupedObservable<String, Message>(key: "2017-01-01", source: RxSwift.(GroupedObservableImpl in _FBBDBB31E5DDAA1ED24286DA8D9FFB1F)<Swift.String, Tacos.Message>)
GroupedObservable<String, Message>(key: "2017-01-02", source: RxSwift.(GroupedObservableImpl in _FBBDBB31E5DDAA1ED24286DA8D9FFB1F)<Swift.String, Tacos.Message>)

我找不到转换的方法GroupedObservable<String, Message> => Observable<SectionModel<String,Message>>

转换为Message的JSON如图: json description here

我不是很了解你,但也许

let group = source.groupBy { [=11=] }.flatMap { [=11=].asObservable() }

这是您要实现的目标吗?

更新:(但没有 SectionModel 的泛型)

let group = source
    .groupBy {
        return [=10=]
    }
    .switchLatest()
    .map { text -> SectionModel in
        return SectionModel(title: text)
    }
        let messages = [
            Message(id: 1001, msgContent: .Text("TextContent1"), sender: .Host, date: "2017-01-01T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1002, msgContent: .Text("TextContent2"), sender: .Guest, date: "2017-01-01T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1003, msgContent: .Text("TextContent3"), sender: .Host, date: "2017-01-01T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1004, msgContent: .Text("TextContent4"), sender: .Host, date: "2017-01-02T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1005, msgContent: .Text("TextContent5"), sender: .Host, date: "2017-01-02T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1006, msgContent: .Text("TextContent6"), sender: .Guest, date: "2017-01-02T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1007, msgContent: .Text("TextContent7"), sender: .Host, date: "2017-01-03T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1008, msgContent: .Text("TextContent8"), sender: .Guest, date: "2017-01-03T01:00:00.000Z".dateFromISO8601!),
            Message(id: 1009, msgContent: .Text("TextContent9"), sender: .Host, date: "2017-01-03T01:00:00.000Z".dateFromISO8601!),
            Message(id: 10010, msgContent: .Text("TextContent10"), sender: .Host, date: "2017-01-03T01:00:00.000Z".dateFromISO8601!)
        ]

        let source = Observable.from(messages)

            let group = source.groupBy { [=10=].date.dateOnly }
            group.flatMap {
                Observable.combineLatest(
                        Observable.just([=10=].key),
                        [=10=].toArray())
                }
                .map { date, messages in
                    Observable.of(MessageGroup(header: date, items: messages))
                }
                .subscribe(onNext: {
                    print([=10=])
                }).disposed(by: disposeBag)

另一种选择是:

    messages
        .map {
            Dictionary(grouping: [=10=], by: { [=10=]. date.dateOnly })
                .map {
                    SectionModel(model: [=10=].key, items: [=10=].value)
                }
        }
        .bind(to: tableView.rx.items(dataSource: tableViewDataSource))
        .disposed(by: disposeBag)
func grouredBy() {
    var section = Observable.from(transactions)
    var group = section.groupBy { [=10=].txnDate }
    group.flatMap { (listOFT) -> Observable<(String?, [TransactionListModel])> in
        var superH =  Observable.combineLatest(Observable.just(listOFT.key),
                                          listOFT.toArray().asObservable())
        return superH
    }.map { date, messages in
        Observable.of(SectionModel(model: date, items: messages))
    }
    .subscribe(onNext: {
        print([=10=])
    }).disposed(by: disposeBag)
}