[swift] NSFetchedResultsController 사용하기

Core Data는 iOS 앱에서 데이터를 관리하고 영구 저장하는 데 사용되는 프레임워크입니다. NSFetchedResultsController는 Core Data와 함께 사용되며, 데이터베이스의 변경 내용을 추적하고 관리하는 데 도움을 줍니다.

1. NSFetchedResultsController 소개

NSFetchedResultsController는 데이터베이스에서 데이터를 가져와 테이블 뷰 또는 컬렉션 뷰와 같은 UI 컴포넌트와 함께 사용할 수 있는 컨트롤러입니다. 이를 통해 데이터의 변경을 모니터링하고 자동으로 UI에 반영할 수 있습니다.

2. NSFetchedResultsController 설정하기

NSFetchedResultsController를 사용하려면 다음 단계를 따라야 합니다.

단계 1: NSFetchRequest 설정하기

NSFetchRequest는 데이터베이스에서 데이터를 가져오는 데 사용되는 객체입니다. 필요한 속성, 정렬 기준 및 필터링 조건을 설정할 수 있습니다. 아래는 간단한 예시입니다.

let request: NSFetchRequest<Item> = Item.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
request.predicate = NSPredicate(format: "category == %@", selectedCategory)

단계 2: NSFetchedResultsController 설정하기

NSFetchedResultsController를 생성하고 설정해야 합니다. 이를 통해 데이터 변경을 추적하고 UI에 업데이트를 적용할 수 있습니다. 아래는 간단한 예시입니다.

let fetchedResultsController: NSFetchedResultsController<Item> = NSFetchedResultsController(
    fetchRequest: request,
    managedObjectContext: context,
    sectionNameKeyPath: nil,
    cacheName: nil
)
fetchedResultsController.delegate = self

단계 3: NSFetchedResultsControllerDelegate 구현하기

NSFetchedResultsControllerDelegate를 구현하여 데이터 변경 시 알림을 받고 UI를 업데이트합니다. 아래는 몇 가지 주요 메서드입니다.

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    tableView.beginUpdates()
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, 
                at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
    case .insert:
        tableView.insertRows(at: [newIndexPath!], with: .fade)
    case .delete:
        tableView.deleteRows(at: [indexPath!], with: .fade)
    case .update:
        tableView.reloadRows(at: [indexPath!], with: .fade)
    case .move:
        tableView.moveRow(at: indexPath!, to: newIndexPath!)
    }
}

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    tableView.endUpdates()
}

3. NSFetchedResultsController 사용하기

위의 설정을 마친 후, NSFetchedResultsController가 데이터 변경을 모니터링하고 UI에 반영됩니다. 변경 이벤트가 발생할 때마다 NSFetchedResultsControllerDelegate에 구현된 메서드가 호출되어 UI가 업데이트됩니다.

do {
    try fetchedResultsController.performFetch()
    tableView.reloadData()
} catch {
    print("Error performing fetch: \(error)")
}

이제 NSFetchedResultsController를 사용하여 Core Data의 데이터를 손쉽게 관리할 수 있습니다.

결론

NSFetchedResultsController는 Core Data와 함께 사용되어 데이터베이스의 변경 내용을 추적하고 UI에 자동으로 반영하는 데 도움을 줍니다. 이를 통해 앱의 데이터 관리를 간편하게 처리할 수 있습니다.