0

在 tableView 的 willDisplay 中检查最新的单元格,然后触发对即将引用为分页的数据的新请求。

我也想保持该自定义对象数组的 ID 对于即将到来的数据是唯一的。

我尝试了以下解决方案来实现它,但我想知道有什么可以更有效地做吗?

let idSet = NSCountedSet(array: (newDatas + self.ourDatas).map { $0.id })
let arr = (newDatas + self.ourDatas).filter { idSet.count(for: $0.id) == 1 }
self.ourDatas = arr // ourDatas is dataSource of tableView
self.tableView.reloadData()

同样上述方式混合了所有数据,我怎样才能继续保持它的顺序?

4

2 回答 2

0

您应该保留两个属性;您的项目数组 ( ourDatas) 和一组 id ( var ourIds = Set<String>()。我假设您的 id 是Strings

你可以做这样的事情

var insertedRows = [IndexPath]()
for newItem in newDatas {
   if !ourIds.contains(newItem.id) {
      insertedRows.append(IndexPath(item:self.ourDatas.count,section:0))
      ourIds.insert(newItem.id)
      ourDatas.append(newItem)
   }
}

if !insertedRows.empty {
   self.tableView.insertRows(at: insertedRows, with:.automatic)
}
于 2021-08-13T13:00:05.227 回答
0

为此,我有一个 Array 的辅助扩展。它“减少”了一个只有“不同”元素的数组:

public extension Array where Element: Identifiable {
    var distinct: [Element] {
        var elements = Set<Element.ID>()
        return filter { elements.insert($0.id).inserted }
    }
}

基于元素的id. 也就是说,您需要让您的元素符合Identifiable- 在 TableView 或 List 中显示它们时,这无论如何都非常有用。

因此,当您收到一个新的元素数组时,只需执行以下操作:

    self.elements = (self.elements + newElements).distinct

Playgrounds 的小测试:

extension Int: Identifiable {
    public var id: Int { self }
}

var a = [1,2,3,4,5]
var b = [1,2,3,6,7]

print((a + b).distinct)

安慰:

[1, 2, 3, 4, 5, 6, 7]
于 2021-08-13T20:43:27.233 回答