2017-09-14 97 views
0

我想将日期显示为部分标题并按照日期对消息进行分组。 我想使用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

回答

0
 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) 
+0

toArray()仅在获得Completed事件时才有效 – ahsumra

0

我还不太了解你,但也许

let group = source.groupBy { $0 }.flatMap { $0.asObservable() }

是你想达到什么样的?

更新:(但不仿制药SectionModel)

let group = source 
    .groupBy { 
     return $0 
    } 
    .switchLatest() 
    .map { text -> SectionModel in 
     return SectionModel(title: text) 
    } 
+0

如果我们这样做那么'group'将类型可观察的,我们相当于'source'我想一些人知道如何将'group'转换为'GroupedObservable '=>'Observable >' – ahsumra

+0

请查看JSON文件中给出的消息的平面列表 我想将其转换进入'Observable >',我将使用它绑定到rxdatasource以显示按日期分组的消息表。 – ahsumra

+0

@AarifSumra检查更新的答案 –

相关问题