首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于来自服务器和本地的数据集更新TableView

基于来自服务器和本地的数据集更新TableView
EN

Stack Overflow用户
提问于 2021-10-02 19:32:10
回答 1查看 30关注 0票数 0

我有一个tableView,它显示所有的新闻,然后如果任何新闻获得更新或新的新闻被添加,我检查和更新如下。我想知道我的方法是否正确,同时也在寻找更好的选择(tableviewdiffsource?)

目前用户可以看到以下4条新闻的顺序

n1、n2、n3、n4

当用户拉取刷新时,他从服务器得到3条新闻: n4,n5,n6

现在,我应该按照n4、n5、n6、n1、n2、n3的顺序显示新闻

代码语言:javascript
复制
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()
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-02 21:01:00

DiffableDataSource可能是最有效的解决方案。

但是,您的代码也可以通过使用filtermap等更高级的函数进行优化。

首先,计算更新后新闻的索引。当新项目被插入到顶部时,插入索引路径等于新项目的索引。

则在过滤后的索引处移除项目,并在索引0处插入新项目。reversed()避免了超出范围的崩溃。

代码语言:javascript
复制
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()
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69419621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档