Пытаясь понять, как реализовать IGListDiff для moveItemAt - UICollectionViewCell? - PullRequest
0 голосов
/ 25 апреля 2019

Я использую IGListDiff часть IGListKit фреймворка с открытым исходным кодом.

Это позволяет мне легче манипулировать, действовать и обновлять мои UICollectionView и UICollectionViewCell в моемПриложение.

Но я изо всех сил пытаюсь понять реализацию для moveItemAt.

Действительно, я хотел бы иметь возможность переместить мой UICollectionViewCell от длительного нажатия на них.Похоже, что IGListDiff может с этим справиться (переместить - вставить и удалить).

Вот моя реализация moveItemAt:

func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {

    let item = items.remove(at: sourceIndexPath.item)
    items.insert(item, at: destinationIndexPath.item)
 }

Ничего особенного, без этого я не могуне двигай мои клетки.Но оно также запускает обновление с IGListDiff, потому что я изменяю источник данных, и мне кажется, что оно "удваивает" обновление моего UICollectionView.

Я делаю remove / insert в moveItemAt , но также и в моем методе execute при изменении источника данных:

extension UICollectionView {

    func perform(result: DiffList.Result) {

        if result.hasChanges {

            self.performBatchUpdates({

                if !result.deletes.isEmpty {
                    self.deleteItems(at: result.deletes.compactMap { IndexPath(row: $0, section: 0) })
                }
                if !result.inserts.isEmpty {
                    self.insertItems(at: result.inserts.compactMap { IndexPath(row: $0, section: 0) })
                }
                if !result.updates.isEmpty {
                    self.reloadItems(at: result.updates.compactMap { IndexPath(row: $0, section: 0) })
                }
                if !result.moves.isEmpty {
                    result.moves.forEach({ (index) in
                        let toIndexPath = IndexPath(row: index.to, section: 0)
                        self.moveItem(at: IndexPath(row: index.from, section: 0), to: toIndexPath)
                    })
                }
            })
        }
    }
}

Наконец, это мой источник данных, который запускает метод perform для любой модификации:

private(set) var items = [AnyEquatableCellConfigurator]() {
        didSet {
            if oldValue.isEmpty {
                self.collectionView.collectionViewLayout.invalidateLayout()
               self.collectionView.reloadData()
            } else {
                let oldHashes = oldValue.map { $0.hash }
                let newHashes = items.map { $0.hash }
                let result = DiffList.diffing(oldArray: oldHashes, newArray: newHashes)
                self.collectionView.perform(result: result)
            }
        }
    }

Любая помощь от кого-то, кто уже реализовал moveItemAt с алгоритмом DiffList, будетоценили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...