如何使用 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)
}
我想将日期显示为部分标题并根据日期对邮件进行分组。 我想使用 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)
}