2012-10-13 2 views
5

여러 스레드에서 하나의 MOC를 사용하여 모든 결과가 발생했습니다. MOC가 주 스레드에서 만들어지기 때문에 무작위로 응용 프로그램이 중단되고 다른 스레드. 코드가 글로벌 싱글 톤을 사용하여 동기화 (@ 동기화)해도 응용 프로그램이 충돌합니다. 각 스레드마다 별도의 MOC를 사용하면 문제가 없지만 스레드간에 NSManagedObjects를 공유하는 것은 좋지 않은 접근이라고 생각합니다.핵심 데이터 - 여러 스레드 중 NSManagedObjects 공유

내 사용 사례는 다음과 같습니다. 1) 서버에서 XML을로드하고 구문 분석하고 구문 분석하는 동안 데이터베이스에 각각 새로운 NSManagedObject를 삽입합니다. 이 모든 것은 별도의 스레드에서 발생합니다. 2) 주 스레드에서 사용자는 데이터베이스에서 데이터를 읽는 UI와 상호 작용합니다.

두 스레드에서 NSManagedObjects를 사용합니다. 이 문제를 어떻게 해결할 수 있겠습니까? 이미 여러 번 실패했습니다.

대부분의 경우 응용 프로그램에서 오류가 발생하여 컬렉션을 수정하면서 코드가 동기화되는 동안 컬렉션이 수정되는 동안 코드가 동기화되는 동안 컬렉션이 수정되고 반복되는 동안 수정되지 않으며 반대의 경우도 발생합니다. 수정하는 동안 ' 반복하고 내가 끝나면 구해줍니다.

답변

8

스레드 당 NSManagedObjectContext을 사용하십시오. 스레드간에 통신하는 경우 스레드 안전 인 NSManagedObjectID을 전달하고 스레드 컨텍스트에서 개체를 다시 가져옵니다. 내 애플 리케이션에서는 컨트롤러마다 하나의 컨텍스트를 사용하기도합니다.

다른 컨텍스트를 관리하려면 NSManagedObjectContextDidChangeNotification에 대한 옵서버를 등록하십시오. 이 알림 처리 내에서 mergeChangesFromContextDidSaveNotification: 메서드를 통해 각 컨텍스트로 알림을 전달합니다. 이 메소드는 thread 세이브이며, 문맥을 그 상태로 갱신합니다.

이 후에는보기를 새로 고침해야합니다. 테이블 뷰 기반 애플리케이션을 사용하는 경우 NSFetchedResultsController을 살펴보십시오. 이렇게하면 적절한 애니메이션으로 테이블을 자동으로 업데이트 할 수 있습니다. 테이블 뷰를 사용하지 않는 경우 직접 UI 업데이트를 구현해야합니다.

5

iOS 5 이상 만 지원하는 경우 NSManagedObjectID을 처리하고 더 이상 컨텍스트를 병합 할 필요가 없습니다. 대신 새로운 동시성 유형 NSManagedObjectContext을 사용할 수 있습니다. 그런 다음 managedObjectContext:performBlock 이내에 작업을 수행하면 자동으로 병합됩니다.

여기에 대한 자세한 내용은 svena에서 답변을 참조하십시오 : Core Data and Concurrency using NSOperationQueues

관련 문제