0

주 스레드 용 MOC와 백그라운드 스레드 용 MOC 두 가지 MOC를 사용하고 있습니다. 메인 스레드에서 나는 FRC (NSFetchedResultsController)로 작업하는 UITableView를 가지고있다.CoreData는 백그라운드 MOC에서 저장 작업 중에 오류를 수행 할 수 없습니다.

많은 저장 작업을 실행하면 모든 개체가 삭제되고 몇백 개의 새 개체가 생성됩니다 ...이 시점에서 주 스레드의 UITableView에서 데이터를 새로 고치려면 FRC를 사용하는 것이 좋습니다). 따라서 주 MOC는 (배경 MOC에서받은) NSManagedObjectContextDidSaveNotification 알림에 등록하고 해당 단계에서 mergeChangesFromContextDidSaveNotification을 실행하여 UITableView가 그에 따라 업데이트되는지 확인합니다.

저장 작업 중에 UITableView를 스크롤하려고 할 때까지이 모든 것이 제대로 작동합니다. 내가보기를 스크롤하려고하면 "coredata는 잘못을 이행 할 수 없습니다"예외가 발생합니다. 이것은 FRC가 여전히 삭제 된 개체를 보유하고있는 결과입니다 (저장 작업이 여전히 실행되는 동안 주 MOC에서 NSManagedObjectContextDidSaveNotification 알림의 mergeChangesFromContextDidSaveNotification이 수신됩니다). 이것은 mergeChangesFromContextDidSaveNotification을받은 후 저장 작업과 UITableView 업데이트 사이의 일종의 "경쟁 조건"입니다.

이 두 MOC와 함께 작업하고 FRC를 돌보아이 시나리오에 대처할 수있는 올바른 접근 방법은 무엇입니까? apples doc 당으로

답변

0

:

오류는 문제를 충족 할 수 없습니다 오류 메시지, "코어 데이터 오류를 이행하지 못했습니다"을 참조하십시오.

원인 : 해당 개체의 기본 데이터가 영구 저장소에서 삭제되었습니다.

해결 방법 :이 객체를 폐기해야합니다.

이 문제는 적어도 두 가지 상황에서 발생할 수 있습니다

첫째 :

시작을 관리되는 개체에 대한 강한 참조. 관리되는 개체 컨텍스트를 통해 관리되는 개체를 삭제하십시오. 변경 내용을 개체 컨텍스트에 저장하십시오. 이 시점에서 삭제 된 개체는 오류로 바뀌 었습니다. 그렇게하면 메모리 관리의 규칙을 위반하게되므로 파괴되지 않습니다.

이전에 보유 된 참조에서 특성 또는 관계를 검색하십시오. 코어 데이터는 오류가있는 관리 된 개체를 잘못 처리하려고 시도하지만 개체가 저장소에서 삭제 되었기 때문에 오류가 발생합니다. 즉, 상점에 동일한 글로벌 ID가 인 오브젝트가 더 이상 존재하지 않습니다.

두 번째 :

관리되는 개체 컨텍스트에서 개체를 삭제합니다. 관계를 다른 개체에서 해당 개체로 모두 깨지 못하게하십시오. 변경 사항을 저장하다.

+0

감사합니다. 나는이 글을 읽었습니다 ... "이 객체를 버리기"위해 설명한 아키텍처와 시나리오를 고려할 때 가장 좋은 방법은 무엇입니까? – Joel