2017-04-11 2 views
0

In unserer iOS-Anwendung verwenden wir Kerndaten und binden sie mithilfe von NSFetchedResultsController an eine Tabellenansicht an. Die App ist über "Chat" -Funktion.

UI ist das gleiche wie das iPhone "Nachrichten" -App. Wenn wir auf eine Nachricht tippen, werden der Verlauf und der gesamte Verlauf mit der Zeit gruppiert angezeigt. Die Logik dahinter ist, wenn die vorherige Nachricht und die aktuelle Nachricht mit einer Lücke von 1 Stunde empfangen werden, dann wird das Datum & Zeitstempel über die letzte Nachricht angezeigt.

Meine Frage ist, wie kann ich die Nachrichten gruppieren und sie abholen, so dass ich das Datum & Zeitstempel sowie Sender und Empfänger Nachrichten anzeigen kann.Gruppieren von Nachrichten ähnlich der iPhone-Nachrichten-App

Antwort

0

Es gibt vier Arten von Nachrichtenzellen: regulär, Gruppenstart, Gruppenmittelpunkt, Gruppenende. Eine Gruppenstart-Nachricht ist mehr als eine Stunde nach dem letzten, aber weniger als eine Stunde vor dem nächsten. Gruppe-Mitte ist weniger als eine Stunde von der vorherigen und nachher. das Gruppenende ist dem vorherigen sehr nahe, aber mehr als eine Stunde dem nächsten. Regelmäßig ist mehr als eine Stunde davor und danach.

Es gibt zwei Teile dieses Projekts. Eine besteht darin, jeden Zellentyp korrekt anzuzeigen. Der andere ist herauszufinden, welcher Typ jede Nachricht ist. Ich nehme an, dass Sie die UI-Sachen selbst herausfinden können (unterschiedliche Polsterung, für jeden, regelmäßigen und Gruppenanfang zeigen Sie die Zeit an, nicht einige Ecken rundend, usw.).

Für jede Nachricht seinen Typ herauszufinden, ist nicht so schwer - schauen Sie sich einfach die Nachricht vor und nach ihm. Es kann in einem einzigen Durchlauf der Ergebnisse durchgeführt werden - O (n). Es könnte auch träge mit einem Cache gemacht werden (dh jedes Mal, wenn eine Zellenladung die Nachricht vor und nach der Überprüfung prüft, wird die Antwort zum nächsten Mal im Cache gespeichert). Wenn die Zellengrößen für verschiedene Typen unterschiedlich sind, dann verursacht dies ein seltsames Springen mit geschätztemRowHeight. Sie können die Ergebnisse des Typs auch in Core-Daten speichern, nachdem Sie sie berechnet haben.

Seien Sie vorsichtig, wenn eine Nachricht eingefügt wird, um den Nachrichtenzelltyp für den darüber und darunter liegenden Nachrichtentyp ungültig zu machen und neu zu berechnen. Wenn Sie den Nachrichtenzellentyp berechnen, berücksichtigen Sie auch Situationen, in denen keine nächste oder vorherige Zelle vorhanden ist.

Ich denke, Sie haben auf einige Kerndaten-Magie gehofft - wie einen Hackertrick mit sectionIndexKey. Aber es ist wirklich viel oder einfach, einfach durch das Array zu laufen und es zu berechnen.

+0

Danke. Es ist nicht nur so einfach, wie wir es theoretisch über die Implementierung wissen. Core-Daten zusammen mit dem Fetch-Ergebnis-Controller und das entsprechende Aktualisieren der Sammlungsansicht/Tabellenansicht ist eine ziemlich komplexe Lösung. – Satyam

+0

Ich habe es getan. nahm mich ungefähr 2 Wochen. Wenn Sie immer noch Probleme mit nur dem abgerufenenResultsController und den Updates haben, würde ich empfehlen, zuerst 100% zu erhalten und dann die Gruppierung der geschlossenen Nachrichten hinzuzufügen. –

+0

Danke für den Vorschlag. readedResultsController Implementierung überhaupt kein Problem, es ist schon fertig. Wenn Sie zur Gruppierung kommen, müssen Datum und Zeitstempel zwischen zwei Nachrichten hinzugefügt werden, und zwar auch die Überschrift des Abschnitts. Es ist eine normale Zeile wie in "Nachrichten auf dem iPhone". Wenn wir die Tabellenansicht verwenden und den Ergebniscontroller - Anzahl der Zeilen abgerufen haben, verwenden Sie die Methoden cellForRowAtindexPath ec. basiert auf dem abgerufenen Ergebnisarray. Das verursacht Problem, eine Zeile mit Datums- und Zeitstempel einzufügen. – Satyam