2

제 코드에는 mainManagedObjectContextbackgroundManagedObjectContext이 있으며 잘 작동합니다.NSManagedObjectContextDidSaveNotification UI를 업데이트하는 가장 좋은 방법은 무엇입니까?

모든 저장 코드를 backgroundManagedObjectContext으로 옮기고 NSManagedObjectContextDidSaveNotification을 통해 컨텍스트 간의 차이점을 병합했습니다.

이제 NSManagedObjectContextDidSaveNotification 이후에 UI를 업데이트하고 싶습니다. 이렇게하려면 NSFetchedResultController 옆에있는 가장 좋은 방법은 무엇입니까?

디버거를 통해 내 개체의 변경 사항을 볼 수 있으며 KVO를 사용할 수 있지만 IMHO는 끔찍한 생각입니다. 내 추상화에서 나는 데이터베이스 호출을 처리하는 모델을 가지고 있으며 컨텍스트를 병합 한 후에도 내 모델의 처리가 변경되면 좋을 것입니다.

이렇게하는 가장 좋은 방법은 무엇입니까?

+0

NSFetchedResultController를 대리자 메서드와 함께 사용하는 것이 가장 좋습니다. – Jim

+0

실제로 비 적합 뷰 기반 뷰의 경우 반입 된 결과 컨테이너가 약간 무거움. 난 그냥 NSManagedObjectDidSaveNotification 형태소 분석 NSNotification 사용하여 주 스레드에서 업데이 트합니다. – GuybrushThreepwood

+0

@GuybrushThreepwood가 이것을 시도한 것은 EXC_BAD_ACCESS입니다. – mariusLAN

답변

2

테이블 및 컬렉션보기의 경우 가장 좋은 방법은 NSFetchedResultsControllerDelegate입니다.

또 다른 메커니즘은이 (또는 사용자 정의) 알림 NSNotificationCenter에 등록하는 것입니다. 원래 알림 : 최고의

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
      selector:@selector(updateUI:) 
       name:NSManagedObjectContextDidChangeNotification 
      object:nil]; 

viewDidAppear에서이 작업을 수행. 옵저버는 반드시 viewWillDisappear에서 삭제해야합니다. 주석 다음에 저장 통지가 아니라 변경 통지를 사용하고 있습니다.

테이블보기가 아닌 컨트롤러에서는 configureCell:atIndexPath:과 같은 메서드를 구현하는 반입 된 결과 컨트롤러 대리자의 상용구 코드와 비슷한 UI 설정을 분리해야합니다. 그런 다음 코드를 복제하지 않고 알림을 받으면이 설정 루틴을 호출 할 수 있습니다.

+0

대신 NSManagedObjectContextObjectsDidChangeNotification을 관찰하는 것이 좋습니다. 객체가 저장 될 때가 아니라 객체가 변경되는 시점에 신경을 쓰면 'processPendingChanges'중에 알림이 일괄 처리되도록 나타납니다. 이런 방식으로 변경된 속성도 알 수 있습니다. UI를 선택적으로 업데이트하는 데 유용 할 수 있습니다.이 정보는 이미 저장 후 삭제됩니다. –

+0

감사합니다 - 당신은 절대적으로 옳습니다. – Mundi

+0

지금 사용 중입니다. 잘 작동 :) 도움을 주셔서 감사합니다! – mariusLAN