我有一个tableView,它显示所有的新闻,然后如果任何新闻获得更新或新的新闻被添加,我检查和更新如下。我想知道我的方法是否正确,同时也在寻找更好的选择(tableviewdiffsource?)
目前用户可以看到以下4条新闻的顺序
n1、n2、n3、n4
当用户拉取刷新时,他从服务器得到3条新闻: n4,n5,n6
现在,我应该按照n4、n5、n6、n1、n2、n3的顺序显示新闻
var allNews = [News]()
func didFetchNews(newNews:[News]) {
var news:[News] = newNews
var newsSet = Set(newNews)
var deletedPaths = [IndexPath]()
for i in 0..<allNews.count {
let news = allNews[i];
if !newsSet.contains(news) {
news.append(news)
} else {
deletedPaths.append(IndexPath(row: i, section: 0))
}
}
var insertedPath = [IndexPath]()
for i in 0..<newNews.count {
insertedPath.append(IndexPath(row: i, section: 0))
}
self.tableView.beginUpdates()
self.tableView.insertRows(at: insertedPath, with: .automatic)
self.tableView.deleteRows(at: deletedPaths, with: .automatic)
self.tableView.endUpdates()
}发布于 2021-10-02 21:01:00
DiffableDataSource可能是最有效的解决方案。
但是,您的代码也可以通过使用filter和map等更高级的函数进行优化。
首先,计算更新后新闻的索引。当新项目被插入到顶部时,插入索引路径等于新项目的索引。
则在过滤后的索引处移除项目,并在索引0处插入新项目。reversed()避免了超出范围的崩溃。
func didFetchNews(newNews: [News]) {
let deletionIndices = allNews.indices.filter{newNews.contains(allNews[$0])}
let deletionIndexPaths = deletionIndices.map{IndexPath(row: $0, section: 0)}
let insertionIndexPaths = newNews.indices.map{IndexPath(row: $0, section: 0)}
for index in deletionIndices.reversed() { allNews.remove(at: index) }
allNews.insert(contentsOf: newNews, at: 0)
self.tableView.beginUpdates()
self.tableView.insertRows(at: insertionIndexPaths, with: .automatic)
self.tableView.deleteRows(at: deletionIndexPaths, with: .automatic)
self.tableView.endUpdates()
} https://stackoverflow.com/questions/69419621
复制相似问题