如何比较2个集合并生成用于更新UITableView的更新结构?

时间:2019-03-23 10:47:13

标签: ios swift uitableview

我有一组数据,使用Structs进行建模,并符合CodableEquatable

enum FeedItemType: String, Codable {
    case selling = "ITEM_FOR_SALE"
    case facebook = "FACEBOOK_POST"
    case tweet = "TWITTER_POST"
}

enum FeedItemStatus: String, Codable {
    case created = "CREATED"
}

struct FeedItem: Codable, Equatable {
    var item: FeedItemContent
    var liked: Bool
    var commented: Bool

    private enum CodingKeys: String, CodingKey {
        case liked, commented
        case item = "feedItem"
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.item = try container.decode(FeedItemContent.self, forKey: .item)
        self.liked = try container.decode(Bool.self, forKey: .liked)
        self.commented = try container.decode(Bool.self, forKey: .commented)
    }
}

我对此数组进行迭代,并用UITableView的内容填充FeedItemContent,其中的内容本身也是CodableEquatable

由于此数据列表是分页的,可以在服务器端进行更新,因此在获取新数据时,而不是重新加载整个UITableView,我只想对不同的行进行更改或追加新的行,原始收藏中缺少的。

从JS背景开始,我通常将旧对象和新对象散布在一个新的空对象上,然后让React找出发生了什么变化。

我不确定如何在Swift / iOS中实现这一目标。

2 个答案:

答案 0 :(得分:1)

虽然您的问题有点难以理解,但是听起来您在尝试获取新数据时仅尝试更新表视图中的相关行。

有多种方法可以使用各种差异算法来实现此目的,但是我本人通常使用Dwifft来实现此目的,非常快速且极其轻巧。

  

Dwifft是一个小的Swift库,它告诉您“ diff”是什么   在两个集合之间,即一系列“编辑操作”   需要把一个变成另一个。它还带有UIKit   绑定,以自动,生动地保持   通过使UITableView / UICollectionView与一条数据同步   必要的行/节插入/删除请求作为数据   变化。

答案 1 :(得分:1)

如果在获取新数据时尝试仅更新tableview中的相关行,请使用Dwifft,因为它可以很好地满足您的目的。