是否有更有效的方法来通过每个分页数据提要保持自定义对象数组的唯一性?

Is there more efficient way to keep custom object array unique by each pagination data feeds?

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

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

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

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

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

你应该保留两个属性;您的项目数组 (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)
}

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

public extension Array where Element: Identifiable {
    var distinct: [Element] {
        var elements = Set<Element.ID>()
        return filter { elements.insert([=10=].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]