2009-12-08 3 views
1

관리되는 개체 컨텍스트가 수백 개의 관리되는 개체를 만드는 별도의 스레드에 있고 저장하면 저장 알림이 주 스레드와 다른 컨텍스트로 전달됩니다 (기본 스레드가) 업데이트됩니다mergeChangesFromContextDidSaveNotification 거의 걸릴

문제는 병합 때로는 40 ~ 50 초 너무 많은 시간이 소요되고,이 메인 스레드 & UI를 감금되어 있다는 점이다

[ApplicationDelegate performSelectorOnMainThread:@selector(managedObjectContextDidSave:) 
             withObject:notification 
            waitUntilDone:NO]; 

스레드에서. 업데이트하는 데 오랜 시간이 걸리는 이유가 있습니까?

편집

이 현재 합병에 의해 영향을받는 데이터를 표시하는 가져온 결과 컨트롤러가있는 경우에만 일어날 것으로 보인다. 어떤 아이디어?

답변

3

NSFetchedResultsController에는 NSFetchedResultsControllerDelegate이 있으며 병합 결과 많은 업데이트를 처리해야한다고 가정합니다. 이러한 업데이트로 인해 테이블에서 많은 활동이 발생하여 지연이 발생할 수 있습니다. 당신이 할 수있는 무엇

메인 스레드에서 호출 할 때 일시적으로 NSFetchedResultsController에서 대리자를 제거하는 래퍼 방법을 만드는 것입니다, 다음 managedObjectContextDidSave를 호출 한 다음 테이블을 갱신 한 후 NSFetchedResultsControllerDelegate 복직.

+0

답변 해 주셔서 감사합니다. 그래, 나는 성가신 대의원에게 그것을 좁혔다! 나는 FRC가 할 일은 테이블 뷰를 다시 가져 와서 새로 고침을하는 것이지만, 그때는 통지를받는다고 생각 하겠지만, 그것이 그렇게 오래 걸리는 이유는 무엇일까? 실제로 구현시 알림을받을 때 간단한 재로드가 필요하지 않으므로 실제로 모든 FRC의 대리인과의 연결을 끊었습니다. 나는 컨텍스트의 "변경된 내용"알림 및 패치/다시로드를 수신 대기합니다. 귀하의 답변 주셔서 감사합니다! –

관련 문제