Diffable 데이터 소스와 함께 핵심 데이터를 사용하는 방법 - 최소한의 예

7869 단어 iosswift
한동안 iOS 앱을 개발해 왔다면 테이블 보기와 컬렉션 보기를 설정하는 것이 기억에 남을 것입니다. UI 구성 요소를 준비하고 데이터 소스와 위임을 설정한 다음 각 섹션에서 허용할 섹션과 행 수를 해당 구성 요소에 알려주는 메서드를 구현합니다. 마지막으로 필요한 단계는 각 행에 대한 셀을 구성하는 것입니다.

Core Data와 함께 이 이전 설정을 사용한다는 것은 대부분의 경우NSFetchedResultsController 데이터 콘텐츠가 변경되고 그에 따라 테이블/컬렉션 보기를 업데이트해야 하는 시기를 알려주는 대리자의 구현을 의미합니다.

Diffable 데이터 소스는 이것을 훨씬 쉽게 만듭니다. 그러나 또한 프로세스가 완전히 다르며 익숙해지기가 약간 어려울 수 있습니다.

Core Data를 사용하여 새 프로젝트에서 Diffable 설정 속도를 높이기 위해 나와 다른 사람을 위해 이 짧은 예제를 작성하고 있습니다. 결과는 초기 컬렉션 보기를 작동시키는 세 가지 더 짧은 방법입니다.

이 예에서는 UICollectionView를 사용하고 있지만 UITableView는 기본적으로 동일합니다.

참고: 내 예제의 프로젝트 대체Model 클래스에서 고유한 핵심 데이터 엔터티로 대체하십시오.

속성 선언부터 시작하겠습니다.

var datasource: UICollectionViewDiffableDataSource<Int, Model>!
var fetchedResultsController: NSFetchedResultsController<Model>!

참고: UITableView의 경우 UITableViewDiffableDataSource 를 사용합니다. 섹션에 대한 유형이 필요하므로 Int가 사용됩니다. 하나만 있으면 Int , String 를 사용한 다음 "0"또는 빈 문자열을 전달할 수 있습니다.

UICollectionViewDiffableDataSource 구성



다음으로 datasource를 다음과 같이 구성합니다.

func configureDatasource() {
        datasource = UICollectionViewDiffableDataSource(collectionView: collectionView, cellProvider: { (collectionView, indexPath, scan) -> UICollectionViewCell? in
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ModelCell", for: indexPath) as! ModelCell
            cell.configure(with: model)
            return cell
        })
}
UICollectionViewDiffableDataSource 의 인스턴스를 생성하기만 하면 됩니다. 이전collectionView 방법의 최신 버전인 우리cellProvider와 구성cellForRowAt을 제공합니다.

이것은 우리가 전달할 수 있는 별도의 방법일 수 있습니다. 이것은 하나의 예이고 저는 인라인 버전을 사용하고 있습니다.

NSFetchedResultsController



구성 시간NSFetchedResultsController:

func initFetchedResultsController() {
        fetchedResultsController = NSFetchedResultsController(fetchRequest: Model.sortedFetchRequest, managedObjectContext: Database.shared.context, sectionNameKeyPath: nil, cacheName: nil)
        fetchedResultsController.delegate = self
        try! fetchedResultsController.performFetch()
}

애니메이션 변경



그리고 거의 마지막 단계로 데이터가 변경될 때 collectionView를 업데이트하는 메서드를 구현해야 합니다.

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) {
        var diffableDataSourceSnapshot = NSDiffableDataSourceSnapshot<Int, Model>()
        diffableDataSourceSnapshot.appendSections([0])
        diffableDataSourceSnapshot.appendItems(fetchedResultsController.fetchedObjects ?? [])
        datasource?.apply(diffableDataSourceSnapshot, animatingDifferences: view.window != nil)
}

마지막으로 viewDidLoad에서 이러한 메서드를 호출해야 합니다.

override func viewDidLoad() {
        super.viewDidLoad()
        configureDatasource()
        initFetchedResultsController()
}

물론 이 솔루션은 완벽하지 않으며 의도된 것도 아닙니다. 내 목표는 원하는 대로 조정할 수 있는 가장 간단한 작업 예제를 보여 주는 것이었습니다.

여기와 내 블로그에 iOS/Swift에 대해 씁니다nemecek.be.

좋은 웹페이지 즐겨찾기