2017-08-17 3 views
0

チャットメッセージtableViewがあり、メッセージをロードしたい。
tableViewの再読み込みを高速にできるように考えていますか? この機能を試してみます。
しかし、私はより良い方法を行う方法がわかりません。
ありがとうございます。任意のチャットで
どのようにして、テーブルビューの迅速な配列の追加とソートを行う

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

「loadMessages」をどこから呼び出していますか?最良の場所は、すべてのメッセージ受信時に 'loadMessages'を呼び出す通知を設定します。前景にいる場合は、日付のような操作を行う必要はありません。 –

+3

どの操作が遅いか推測しない*。 Instrumentsと* profileを使用してください。* –

+0

実際に単純に(ソートされた)配列を割り当てることは、* removed + appending *と同じ効果を持ちます。 – vadian

答えて

0

チャットビューに多くのメッセージのを持つことができるので、非常にまれreloadData()を使用されていません。

代わりに、特定のアイテム(またはセル)をリロード(再レイアウト)する必要があります。あなたは州の違いを作成する必要があります。 差分には任意のライブラリを使用できます(例:https://github.com/wokalski/Diff.swift

また、nMessenger(https://github.com/eBay/NMessenger)も使用できます。 PinterestのAsyncDisplayKit(別名テクスチャ)に基づくメッセンジャービュー。

+1

>どのチャットでもチャットビューでたくさんのメッセージを送ることができるので、reloadData()はごくまれにしか使用されません。 技術的にはいですが、その理由は「多くのメッセージ」ではありません。私たちは素敵なアニメーションとHIGのために 'reloadData'の代わりに'(reload/delete/insert)Rows'メソッドを使用しますが、reloadDataは膨大な量のアイテムで時間がかかるからです。 'reloadData'は、uiの可視部分だけを更新します。 – pacification

+1

このリンクは質問に答えるかもしれませんが、ここでは答えの重要な部分を含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](/レビュー/低品質の投稿/ 17059216) – derape

関連する問題