공식문서에 있는 정의로는 데이터를 관리하고 모음 보기에 대한 셀을 제공하는 데 사용하는 개체라고 한다.
Diffable DataSource에 대해선 wwdc2019영상에서 매우 자세히 설명해준다.
참고 : https://developer.apple.com/videos/play/wwdc2019/220/
우선 뷰의 Presentation을 diffable dataSource로,
데이터는 diffable 과 같이 도입된 snapshot을 이용하였고,
레이아웃은 compositional layout으로 변경해주었다.
위 방식대로 기존의 dataSource에 대한 익스텐션, 관련 메소드를 전부 제거한 후
아래와 같이 변경해주었다.
//
// FrameworkListViewController.swift
// AppleFramework
//
// Created by joonwon lee on 2022/04/24.
//
import UIKit
class FrameworkListViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
let list: [AppleFramework] = AppleFramework.list
var dataSource: UICollectionViewDiffableDataSource<Section, Item>!
// Section이 무엇인지
enum Section {
case main
}
// Item이 뭘 지칭하는지
typealias Item = AppleFramework
// Data, Presentation, Layout
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
navigationController?.navigationBar.topItem?.title = "☀️ Apple Frameworks"
/*
diffable datasource - Presentation
snapshot - Data
compositional layout - layout
*/
// diffable datasource - Presentation
dataSource = UICollectionViewDiffableDataSource<Section, Item>(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameworkCell", for: indexPath) as? FrameworkCell else {
return nil
}
cell.configure(item)
return cell
})
// snapshot - Data
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
snapshot.appendSections([.main])
snapshot.appendItems(list, toSection: .main)
dataSource.apply(snapshot)
// compositional layout - layout
collectionView.collectionViewLayout = layout()
}
// compositional layout - layout
private func layout() -> UICollectionViewCompositionalLayout {
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.33), heightDimension: .fractionalHeight(2))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalWidth(0.5))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 3)
let section = NSCollectionLayoutSection(group: group)
let layout = UICollectionViewCompositionalLayout(section: section)
return layout
}
}
extension FrameworkListViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let framework = list[indexPath.item]
print(">>> selected: \(framework.name)")
}
}
참고자료 및 자세한 내용