IGListKit "isEqual" всегда возвращает "true", даже если массив элементов обновлен или заменен

Я использую IGListKit. Я создал простое приложение с этим. Это приложение показывает список элементов, который называется каналами в моем коде.

Ниже мой код. Когда метод update вызывает пользовательское действие, новые каналы генерируются со значением randam и добавляются в массив каналов. Когда вызывается метод replace, массив каналов полностью заменяется новыми сгенерированными элементами канала.

class ViewController: UIViewController, ListAdapterDataSource {

lazy var adapter: ListAdapter = {
    return ListAdapter(updater: ListAdapterUpdater(), viewController: self)
}()

@IBOutlet weak var collectionView: UICollectionView!

var channels: [Channel] = []

private var generateCount = 0

override func viewDidLoad() {
    super.viewDidLoad()

    self.adapter.collectionView = self.collectionView
    self.adapter.dataSource = self
}

func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
    return self.channels as! [ListDiffable]
}

func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
    return ChannelSectionController()
}

func emptyView(for listAdapter: ListAdapter) -> UIView? {
    return nil
}

@IBAction func update(_ sender: UIButton) {
    let newChannels = self.generateNewChannel()

    // Append
    self.channels += newChannels

    self.adapter.performUpdates(animated: true, completion: nil)
}

@IBAction func replace(_ sender: UIButton) {
    let newChannels = self.generateNewChannel()

    // Replace
    self.channels = newChannels

    self.adapter.reloadData(completion: nil)
}

func generateNewChannel() -> [Channel] {
    // Generate new Channel List.
    var newChannels = [Channel]()

    for i in 0 ..< 3 {
        let color = UIColor(red:   CGFloat(arc4random_uniform(255))/255.0,
                            green: CGFloat(arc4random_uniform(255))/255.0,
                            blue:  CGFloat(arc4random_uniform(255))/255.0,
                            alpha: 1.0)

        newChannels.append(Channel(id: "\(self.generateCount * 3 + i)", color: color))
    }
    self.generateCount += 1

    return newChannels
}
}


class Channel {

let color: UIColor
let id: String

init(id: String, color: UIColor) {
    self.id = id
    self.color = color
}
}

extension Channel: ListDiffable {
func diffIdentifier() -> NSObjectProtocol {
    return id as NSObjectProtocol
}

func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
    var isEqual = false
    if let channel = object as? Channel {
        isEqual = (id == channel.id)
    }
    print("isEqual: \(isEqual)")    // <- This becomes always "true".
    return isEqual
}
}

Это приложение работает нормально. Отображаемые каналы обновляются правильно.

Однако метод "isEqual" в классе Channel всегда возвращает "true", даже если элементы массива канала, которые используются в objects Метод обновлен или заменен. Это правильное поведение? Насколько я понимаю, это должно быть "ложным", когда элементы массива канала изменены.

0 ответов

Другие вопросы по тегам