2

알겠습니다. 문제를 해결하는 방법을 모르겠습니다.NSManagedObjectContextDidSaveNotification 이벤트가 겹쳐지는 것을 방지하십시오.

다른 문맥을 가진 다른 스레드에서 CoreData 데이터베이스를 업데이트했습니다. 내 문제는 때로는 NSManagedObjectContextDidSaveNotification 이벤트가 중복되어 크래시로 이어지는 기본 손상을 생성한다는 것입니다. 다음은 예입니다 :이 의사 코드 예제 process1에서

Thread     Main           NSFetchResultsController 

Update database 
Save database   NSManagedObjectContextDidSaveNotification1 
         merge           delegate process 1 
                     process 1 done 

Update database 
Save database   NSManagedObjectContextDidSaveNotification2 
         merge           delegate process 2 
                     process 2 done 
Update database 
Save database   NSManagedObjectContextDidSaveNotification3 
         merge           delegate process 3 

Update database 
Save database   NSManagedObjectContextDidSaveNotification4 
         merge   

                     process 3 done 
                     delegate process 4 
                     CRASH 
                     process 4 done 

및 process2이 문제 없이 작동하지만 때로는 메인 쓰레드가 중복 수신 업데이트 이벤트와 당신이 process3이 완료되기 전에 데이터베이스를 읽기 시작할 process4했다.

이를 처리 할 공식적인 방법이 있습니까? CoreData는 이러한 상황에 대해 솔루션을 제공합니까, 아니면 NSLock을 사용해야합니까?

감사

+0

병합 알림을 처리하는 코드 부분을 게시 할 수 있습니까? 그것이 없으면, 나는 추론 할 수있는 사람이 더 있다고 생각하지 않는다. 내가 대답 할 때 말했듯이 컨텍스트는 영구 저장소 코디네이터를 일련 액세스로 잠 그어 이러한 종류의 문제를 방지해야합니다. – paulbailey

답변

2

가 이러한 문제를 방지하기 위해 공유한다는 상황은 영구 저장소 코디네이터를 고정해야합니다.

프로세스 3과 프로세스 4가 주 스레드에서 실행중인 경우 3이 끝나기 전에 어떻게 시작할 수 있습니까? 알림이 게시 된 스레드에서 수신된다는 것을 잊지 마십시오. 따라서 명시 적으로 주 스레드에서 변경 사항을 병합하기 위해 코드를 실행해야합니다 (명백한 사실을 알리는 사과).

+0

의견을 보내 주셔서 감사합니다. NSFetchResultsController가 관련되어 있기 때문에 이것이 더 복잡하다는 것을 알았 기 때문에 제 질문을 업데이트했습니다. 어떻게 든 NSFetchResultsControllerDelegate가 마지막 업데이트를 처리 할 때 데이터베이스가 때때로 업데이트되고 이로 인해 문제가 발생합니다 – CodeFlakes

+1

컨트롤러와 해당 대리자가 빨간색 청어라고 생각합니다. 그 활동은 메인 스레드에서 일어나야합니다. 컨텍스트는 컨텍스트가 생성 된 스레드가 아닌 다른 스레드에서 사용되기 때문에 거의 항상 이러한 충돌이 발생합니다. – paulbailey

관련 문제