2017-08-17 99 views
0

我有一个聊天消息tableView,我想加载消息。
有任何想法让tableView重新加载消息快? 我尝试这个功能。
但我不知道如何做更好的方法。
谢谢。
如何使数组附加并在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

从哪里调用'loadMessages'?最好的地方是设置一个通知,在每个消息接收时调用'loadMessages'。如果你在前台,不需要像日期那样进行任何操作。 –

+3

不要*猜测*哪些操作很慢。使用工具和*配置文件。* –

+0

实际上,简单地分配(排序)数组的效果与*移除+附加*效果相同。 – vadian

回答

0

在任何聊天时很少使用reloadData(),因为你可以有消息很多在聊天视图。

相反,您应该重新加载(重新布局)特定项目(或单元格)。因为你应该创造不同的状态。 您可以使用任何库进行比较(例如 - https://github.com/wokalski/Diff.swift

此外,您可以使用nMessenger(https://github.com/eBay/NMessenger),它非常完美。基于AsyncDisplayKit(又名纹理)的Pinterest信使视图。

+1

>在任何聊天中很少使用reloadData(),因为聊天视图中可以有很多消息。 从技术上说是的,但原因并不是“很多消息”。我们使用'(重新加载/删除/插入)Rows'方法,而不是'reloadData',因为动画和HIG很好,但不是因为“reloadData花费很多时间处理大量的项目”。 'reloadData'只更新UI的可见部分。 – pacification

+1

虽然这个链接可能回答这个问题,但最好在这里包含答案的基本部分并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/17059216) – derape