2014-10-09 4 views
0

백그라운드 스레드에서 CoreData 데이터를 삭제하고 업데이트하는 다소 일반적인 문제가 있으며 UITableView가 이전에 CoreData 객체 배열을 렌더링하는 동안 수신 : 나는 아마도 그것을 해결하기 위해하지만 맹목적으로 코드를 추가 가기 전에, 내가 먼저 문제를 재현하고자하는 방법을 제안 무리를 읽은CoreData를 재현하는 데 문제가 발생했습니다. '오류가 발생하지 않았습니다.'오류가 발생했습니다.

"NSObjectInaccessibleException CoreData could not fulfill a fault for" 

.

내 테스트 케이스에는 3 단계가 있습니다.

  1. 는 백그라운드 스레드를 생성
  2. CoreData
  3. 에서 항목을 가져옵니다. 새 쓰레드에서는 크래시처럼 데이터베이스를 지우고 다시로드하는 긴 루프 (100 회 반복)를 작성하십시오. 백그라운드 스레드는 새로운 NSManagedObjectContext를 작성하지만 PersistantStore를 기본 컨텍스트와 공유합니다.
  4. 기본 컨텍스트에서 새 항목을 계속 가져온 후 무한 루프 (> 10,000 반복)로 기본 UI 스레드를 보낸 다음 가져온 개체를 반복합니다. 또한이 테스트를 다시 시도하지 않고 페치 된 객체의 원래 목록을 반복하여 테스트 해 보았습니다.

이 테스트 케이스는 NSObjectInaccessibleException 오류가 발생할 것으로 예상되지만 모든 것이 완벽하게 작동하며 충돌을 재현 할 수 없습니다. 코드를 검토하고이 오류를 재현 할 수없는 상황에서 모든 것을 올바르게 수행하고있는 것처럼 느껴집니다. 그러나 어떻게 든 야생에서이 충돌이 나타납니다.

이 충돌을 어떻게 재현 할 수 있습니까?

답변

0
  1. 백그라운드에서 컨텍스트를 저장했지만 주 스레드가 주 컨텍스트 또는 병합 프로세스에서 병합되기를 기다리는 동안이 현상이 발생합니다. 따라서 주 스레드와 병렬로 더 많은 항목을 추가하여 저장 및 병합 사이의 시간을 늘리십시오.
  2. 또한 Crashlytics에서이 문제 (top 1)를 얻었으며 거의 ​​항상 [NSFetchedResultsController (PrivateMethods) _managedObjectContextDidChange :]의 개인 메서드에서 발생합니다. (이 줄은 로그 중간에 있습니다 ...). 따라서 TableView + NSFetchedResultsController와 연결된 개체를 추가/제거하십시오. + 여기에 reloadData가 있습니다.
+0

좋습니다. 필자는 적어도 한 가지 요인으로 저장되는 레코드 수를 극적으로 늘리려고 노력할 것입니다. – dirkoneill

+0

원본 데이터가 포함 된 UITableVIew를 동시에 다시로드하는 동안 최대 100,000 개의 레코드를 삭제하고 저장했습니다. 나는이 충돌을 재현하는 것처럼 보이지는 않지만 여전히 Crashlytics에 나타납니다. – dirkoneill

관련 문제