2017-09-14 3 views
0

Je souhaite afficher la date en tant que titre de section et regrouper les messages selon leur date. Je souhaite utiliser la bibliothèque RxDatasource et avoir du mal à créer SectionModel pour alimenter directement la source de données.Comment transformer GroupedObservable <String, Message> en SectionModel <String, Message> en utilisant l'opérateur Groupby de RxSwift?

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) 

Ci-dessous est la sortie que je reçois dans le journal:

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

Je ne suis pas en mesure de trouver le moyen de transformer GroupedObservable<String, Message> =>Observable<SectionModel<String,Message>>

Le JSON qui est converti en Message est comme dans l'image: json description here

Répondre

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() ne fonctionne que s'il obtient l'événement Terminé – ahsumra

0

Je ne vous ai pas bien compris, mais peut-être

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

est ce que vous essayez d'atteindre?

MIS À JOUR: (mais sans génériques pour SectionModel)

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

Si nous le faisons alors le 'group' sera de type Observable et nous équivalent à' source' Je veux un peu à savoir comment transformer 'group' en' GroupedObservable '=>' Observable > ' – ahsumra

+0

Veuillez consulter la liste des Messages plats telle que donnée dans le fichier JSON Je veux le convertir dans 'Observable >' que je vais utiliser pour lier à rxdatasource affiche la table des messages regroupés par date. – ahsumra

+0

@AarifSumra vérifier la réponse mise à jour –