Diffable DataSource로 전환해보기

이재영·2023년 1월 14일
0

what is Diffable DataSource ??

공식문서에 있는 정의로는 데이터를 관리하고 모음 보기에 대한 셀을 제공하는 데 사용하는 개체라고 한다.
Diffable DataSource에 대해선 wwdc2019영상에서 매우 자세히 설명해준다.
참고 : https://developer.apple.com/videos/play/wwdc2019/220/


기존 dataSource를 Diffable DataSource 로 바꾸기

우선 뷰의 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)")
    }
}

  • 추가, 느낀점
    처음 사용해본 snapshot에서는 section과 item에 대해 Unique identifiers가 있었다.
    이 말은 즉, IndexPath가 아니라 이 Unique identifiers로 업데이트하게 된다는 것이였고,
    Apply만 하게되면 새로운 snapshot이 생기게 된다. 사용해본 결과, 전의 방식처럼
    indexPath의 아이템을 일일이 가져오지 않아도 되서 편리하였던것 같다.




참고자료 및 자세한 내용

profile
기록

0개의 댓글