[swift] 코어 데이터 백그라운드 처리

Core Data는 iOS 앱에서 데이터를 관리하는 강력한 프레임워크입니다. 그러나 대량의 데이터 작업이 필요한 경우 메인 스레드에서 작업을 수행하는 것은 좋은 아이디어가 아닙니다. 이런 경우, 백그라운드 스레드에서 작업을 처리하여 사용자 인터페이스의 응답성을 유지할 수 있습니다.

백그라운드 작업을 위한 Context 생성

첫 번째 단계는 백그라운드에서 작업을 처리할 새로운 NSManagedObjectContext를 생성하는 것입니다. 기존의 메인 컨텍스트와는 별개의 컨텍스트를 만들어야 합니다.

let backgroundContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
backgroundContext.persistentStoreCoordinator = CoreDataStack.shared.persistentStoreCoordinator

concurrencyType.privateQueueConcurrencyType를 사용하여 백그라운드에서 작업을 수행하도록 설정합니다. 생성한 컨텍스트는 CoreDataStack 클래스의 persistentStoreCoordinator를 사용하도록 설정합니다.

작업 수행

이제 백그라운드 컨텍스트에서 데이터 작업을 수행할 수 있습니다. 새로운 작업을 추가하려면 perform 메서드를 사용하면 됩니다. 이 메서드는 클로저를 인자로 받고, 해당 클로저가 백그라운드 스레드에서 실행됩니다.

backgroundContext.perform {
    // 여기에서 데이터 작업을 수행합니다.
}

작업 대상 엔티티를 가져오려면 다음과 같이 NSFetchRequest를 사용하여 데이터를 검색할 수 있습니다.

let fetchRequest: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "attribute == %@", argumentArray: ["value"])
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "attribute", ascending: true)]

do {
    let results = try backgroundContext.fetch(fetchRequest)
    // 결과 처리
} catch {
    // 오류 처리
}

데이터를 추가, 수정, 삭제하려면 다음과 같이 작업할 수 있습니다.

let newObject = YourEntity(context: backgroundContext)
newObject.attribute = "value"

backgroundContext.saveChanges()

변경 사항을 메인 컨텍스트와 동기화

백그라운드 컨텍스트에서 작업을 수행한 후, 변경 사항을 메인 컨텍스트와 동기화해야 합니다.

backgroundContext.saveChanges()

let mainContext = CoreDataStack.shared.mainContext
mainContext.performAndWait {
    mainContext.mergeChanges(fromContextDidSave: notification)
}

saveChanges() 메서드를 사용하여 백그라운드 컨텍스트의 변경 사항을 저장한 다음, 메인 컨텍스트와 mergeChanges(fromContextDidSave:) 메서드를 사용하여 변경 사항을 메인 컨텍스트로 가져옵니다.

결론

코어 데이터에서 백그라운드 작업을 처리하는 것은 앱의 성능과 사용자 경험을 향상시키는 중요한 단계입니다. 이를 통해 메인 스레드에서 작업을 분리하고 응답성을 향상시킬 수 있습니다. 백그라운드 컨텍스트를 사용하여 데이터 작업을 처리하면 앱의 일관성을 유지하면서도 사용자에게 원활한 경험을 제공할 수 있습니다.

참고 자료