NSManagedObjectContext
을 사용하는 방법에 대한 많은 기사와 토론에서 이미 연구했지만 아직 내 프로젝트에 만족할만한 아키텍처를 찾을 수 없습니다. . 충돌이 동시에있을 때동시에 백그라운드에서 동기화하면서 UI 상호 작용에서 핵심 데이터 컨텍스트를 조작하는 모범 사례
, 우선 순위에 의해 정렬 된 데이터를 수정할 수 있습니다 세 개의 원이있다 (예 : 구름이 가장 우선 순위가 있습니다.) :
- 사용자 인터페이스, 을
- BLE 메시지, 난 여전히 아이폰 OS 개발에 대한 전문가가 아니에요 때문에 클라우드
에서
context.perform { }
을 사용했습니다. 데이터 가져 오기를 즉각적으로 수행하여 UI에 응답 할 수 있기를 원하기 때문에 가져 오기를 동기화 기능으로 유지했습니다. 그러나이 방법으로는 가끔 "Collection <__NSCFSet: 0x000000000> was mutated while being enumerated"
예외가 발생합니다 (배치 데이터 처리의 경우 forEach
또는 map
함수에서 발생할 수 있음). 배경 대기열에서 업데이트 할 레코드가 많을 때도 UI를 여전히 차단하는 것으로 나타났습니다. 따라서 배경 데이터를 생성하고 부모 - 자식 모델을 사용하여 데이터를 조작했습니다. 기본적으로 주 컨텍스트 (부모)는 데이터 가져 오기 만 담당하며 배경 컨텍스트 (하위)는 backgroundContext.perform { }
을 통해 모든 데이터 변경 (추가/업데이트/삭제)을 조작합니다. 이 접근 방식은 UI 블록 문제를 해결하지만 컬렉션 변경 오류가 가끔 발생하고이 구조에서 또 다른 문제가 발생합니다. 예를 들어 ViewController A에 데이터 레코드를 추가하고 View Controller B로 이동하면 응용 프로그램이 중단됩니다. 배경 컨텍스트가 데이터 레코드 추가를 완료하지 않은 경우에도 동일한 데이터를 즉시 가져옵니다.
따라서 본인은 프로젝트에서 핵심 데이터 사용에 대한 몇 가지 제안을하고 싶습니다. 부모 - 자식 데이터 컨텍스트 모델에서 내가 잘못한 일이 있습니까? 또는 필연적으로 부모 - 자식이없는 실제 다중 컨텍스트 모델을 사용해야합니까? 그것을하는 방법?
내 주요 상황 (부모) 및 배경 컨텍스트 (아이는) 다음과 같이 시작됩니다 :
lazy var _context: NSManagedObjectContext = {
return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
}()
lazy var _backgroundContext: NSManagedObjectContext = {
let ctx = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
ctx.parent = self._context
return ctx
}()
그리고 병합 기능은 다음과 같다 :
@objc func contextDidSaveContext(notification: NSNotification) {
let sender = notification.object as! NSManagedObjectContext
if sender === self._context {
NSLog("******** Saved main Context in this thread")
self._backgroundContext.perform {
self._backgroundContext.mergeChanges(fromContextDidSave: notification as Notification)
}
} else if sender === self._backgroundContext {
NSLog("******** Saved background Context in this thread")
self._context.perform {
self._context.mergeChanges(fromContextDidSave: notification as Notification)
}
}
else {
NSLog("******** Saved Context in other thread")
self._context.perform {
self._context.mergeChanges(fromContextDidSave: notification as Notification)
}
self._backgroundContext.perform {
self._backgroundContext.mergeChanges(fromContextDidSave: notification as Notification)
}
}
}
핵심 데이터 구조의 어떤 조언 감사하겠습니다.