2017-08-17 1 views
0

Ich habe eine Chat-Nachricht TableView, und ich möchte die Nachrichten laden.
Haben Sie eine Idee, TableView Nachrichten schnell neu laden zu lassen? Ich versuche diese Funktion.
Aber ich weiß nicht, wie man den besseren Weg geht.
Danke.
Wie man Array schnell anhängen und sortieren in tableView swift

var contents:[ChatroomMessage] = [ChatroomMessage]() 

func loadMessages() { 

    //I think remove and append are very cost time 
    self.contents.removeAll(keepingCapacity: false) 
    self.chatroom.messages.forEach({ (id,message) in 
     self.contents.append(message) 
    }) 

    if contents.count == 0 {    
     return 
    } 

    self.contents.sort(by: { (a,b) in 
     a.datetime < b.datetime 
    }) 

    self.tableView.reloadData() 
    if self.contents.count > 0 { 
     self.tableView.scrollToRow(at: IndexPath.init(row: self.contents.count-1,section: 0), at: .bottom, animated: false) 
    } 

} 
+0

Woher rufen Sie 'loadMessages'? Der beste Ort ist eine Benachrichtigung zum Aufruf von 'loadMessages' bei jeder empfangenen Nachricht. Wenn Sie sich im Vordergrund befinden, müssen Sie keine Operation wie das Datum ausführen. –

+3

Raten Sie nicht *, welche Operationen langsam sind. Verwenden Sie Instruments und * profile. * –

+0

Das einfache Zuordnen des (sortierten) Arrays hat die gleiche Wirkung wie das * Entfernen + Anhängen *. – vadian

Antwort

0

In jedem Chat sehr selten verwendet wird reloadData(), weil Sie viel von Nachrichten im Chat-Ansicht haben kann.

Stattdessen sollten Sie bestimmte Elemente (oder Zellen) neu laden (relayout). Weil du Unterschiede in den Zuständen schaffen solltest. Sie können jede Bibliothek für Diffs verwenden (zum Beispiel - https://github.com/wokalski/Diff.swift)

Auch können Sie verwenden nMessenger (https://github.com/eBay/NMessenger), es ist perfekt. Messenger-Ansicht basierend auf AsyncDisplayKit (aka Texture) von Pinterest.

+1

> In jedem Chat wird sehr selten reloadData() verwendet, da Sie viele Nachrichten in der Chat-Ansicht haben können. technisch ja, aber der Grund ist nicht "viele Nachrichten". wir verwenden '(reload/delete/insert) Rows' Methoden anstelle von' reloadData' wegen der schönen Animation und HIG, aber nicht weil "reloadData viel Zeit mit einer großen Menge an Elementen benötigt". 'reloadData' aktualisiert nur den sichtbaren Teil von ui. – pacification

+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/17059216) – derape