2010-07-28 4 views
1

설정 :여러 NSManagedObjectContext 간의 무한 재귀 동기화 방지

두 개의 관리 컨텍스트 설정 (iPhone 응용 프로그램에서)이 있습니다. 대부분의 쿼리에 사용하는 주 컨텍스트와 내가 백그라운드에서 수행하려는 장기 실행 작업에 사용하는 백그라운드 컨텍스트

각 관리 대상 개체 컨텍스트에 대해 NSManagedObjectContextDidSaveNotification에 대한 알림을 설정했습니다. 알림에 대한 응답으로 mergeChangesFromContextDidSaveNotification을 호출하여 동기화합니다. 주 컨텍스트에서 상황이 바뀔 때마다 상황이 바뀌기 때문에 백그라운드 컨텍스트에서 일부 작업을 실행해야한다는 요구 사항이 있습니다.

컨텍스트 중 하나에 만 쓰는 것이 좋습니다. 이 경우 주 컨텍스트에 쓰십시오. 그러나 배경 컨텍스트에 쓸 경우 무한 루프가 발생합니다. 백그라운드 컨텍스트에 저장하면 기본 컨텍스트에 대한 알림이 트리거되고 변경 사항을 병합하고 백그라운드 컨텍스트에서 가져온 자체 알림을 실행합니다. 이것은 백그라운드 컨텍스트를 트리거하여 백그라운드 작업을 수행합니다. 백그라운드 작업을 수행하면 다시 작성을 시작합니다.

이 설정이 잘못되었거나 변경 알림에서 "배경 컨텍스트가 변경 될 때마다 백그라운드 작업 처리를 시작하는 방법"이 필요하거나 배경 컨텍스트를 읽어야합니다. -만.

아이디어가 있으십니까? 전형적인 "second-context-for-for-importing"시나리오와는 달리, 배경 컨텍스트와 관련하여 최신 컨텍스트를 유지해야하므로 내 배경에서 적절한 결과를 얻을 수 있어야합니다. 일.

+0

특정 응용 프로그램에 대해서는 잘 모르겠지만 일반적으로 CS에서는 주기적 종속성을 감지/중단해야하는 경우 두 가지 상황이 모두 포함 된 범위에서 상태를 추가 할 수 있습니다. "마크 앤 스위프 (mark-and-sweep)"를 구현합니다. –

답변

1

소리와 같은 디자인 문제가 있습니다. 당신이 그 주위를 돌아 다니는 동안, 당신은 "영구적 인"배경 컨텍스트를 피하는 것을 고려해야합니다. 필자는 일반적으로 작업 당 컨텍스트 (NSOperations가 잘 작동하는)를 표시 한 다음 해당 작업이 완료되면이를 버리는 것이 좋습니다. 따라서 주 컨텍스트 만 업데이트하면되므로 여러 컨텍스트를 동기화 할 필요가 없습니다.

왜 영구 배경 컨텍스트가 필요하다고 생각하십니까? 그 이유가 성능이라고 생각하십니까?

+0

좋은 지적 - 나는 새로운 컨텍스트를 만드는 것이 "값 비싼"방법 이었지만 내게 그것을 측정하지 못했다는 것을 내 머리 속에 생각했다. 나는 "오랜 시간"이 걸릴 무언가를해야하기 때문에 배경 컨텍스트에 대한 이유가 있다면 그 시간 동안 여분의 시작 오버 헤드를 상환하기가 쉽다는 것을 매우 쉽게 추측 할 수 있습니다. 그런 경험에서 새 컨텍스트를 만드는 것이 상대적으로 저렴하다고 제안하는 것입니까? –

+0

새 컨텍스트 만들기는 비용이 많이 들지만 비용이 많이 들지 않아서 두 컨텍스트를 동기화하고 배경 스레드를 계속 실행하려고합니다 (두 번째 컨텍스트는 해당 배경 스레드에 ** 생성 **되어야하므로 전달되지 않습니다) . 그렇습니다. 창조는 값 비싸지 만 "단지를 대비하여"창조물을 살아있게하려는 것보다 훨씬 적습니다. –

0

수신 한 NSNotifications을 모두 포함하는 두 가지 컨텍스트 모두에 대해 NSSet을 만들 수 있습니다. 다른 것을 얻을 때마다 mergeChangesFromContextDidSaveNotification에 전화하기 전에 그걸 확인하십시오. 생각 해보니, 어느 쪽인가의 컨텍스트에 대한 마지막 것을 저장하는 것으로 충분할 것입니다 ...

관련 문제