再描画時にcollectionViewLayout
を入れ替えて、dataSource.apply(snapshot, animatingDifferences: false)
なんてことをしていたが、なんかデータのリフレッシュタイミングでIndex out of range
になると思ったら更新の仕方が大きく勘違いしていたので軽くメモ✍️ (細かい内容は別途記事にしようとおもいます🏃♂️)
結論
UICompositionalLayout + Diffable Data Source
の場合は、基本的にsnapshot
を更新すればよかった。つまり、collectionViewLayout
は下記のように元データを参照させるようにして
collectionView.collectionViewLayout = UICollectionViewCompositionalLayout {[unowned self] section, _ in switch viewModel.sections.value[section] { case .largeItem(let item, let section): return layoutGenerator.largeLayoutSection(item: item, isFirstItem: section == 0) case .smallItems(let items, _): return layoutGenerator.itemsLayoutSection(items: items) } }
再描画時には、dataSource.apply(snapshot, animatingDifferences: false)
を実行すればいいということです🛠
let snapshot = dataSource.snapshot() // TODO: snapshot更新処理 dataSource.apply(snapshot, animatingDifferences: false)
てな感じで本日も以上となります🍺