如何使用RxSwift的Groupby运算符将GroupedObservable 转换为SectionModel ?
问题描述:
我想将日期显示为部分标题并按照日期对消息进行分组。 我想使用RxDatasource库,并且无法创建SectionModel直接向数据源提供数据。如何使用RxSwift的Groupby运算符将GroupedObservable <String,Message>转换为SectionModel <String,Message>?
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 { $0 }
let group = source.groupBy { $0.date.dateOnly }
group.subscribe(onNext: {
print($0)
}).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 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 { $0.date.dateOnly }
group.flatMap {
Observable.combineLatest(
Observable.just($0.key),
$0.toArray())
}
.map { date, messages in
Observable.of(MessageGroup(header: date, items: messages))
}
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
答
我还不太了解你,但也许
let group = source.groupBy { $0 }.flatMap { $0.asObservable() }
是你想达到什么样的?
更新:(但不仿制药SectionModel)
let group = source
.groupBy {
return $0
}
.switchLatest()
.map { text -> SectionModel in
return SectionModel(title: text)
}
toArray()仅在获得Completed事件时才有效 – ahsumra