2012-10-08 4 views
2

내지도에 특수 효과를 채워야합니다. 각 주석에는 원격 서버에서 가져 오는 해당 지역 리소스가 있습니다. 각 장소에는 카테고리가 연결되어 있습니다. 서버에서도 별도의 리소스로 가져옵니다.많은 리소스를 비동기 적으로 가져 와서 "비동기 적으로"데이터베이스에 저장합니다. 어떤 좋은 패턴을 사용해야합니까? (AFNetworking, Core Data)

주어진 영역을 채우려면 100 개의 장소를 가져와야하며 각각은 20 개의 카테고리 중 하나에 속한다고 가정 해 봅시다. 실제로는 훨씬 많은 카테고리가 있습니다.

AFNetworking을 사용하여 두 리소스를 모두 가져옵니다. 필자는 오프라인 사용을 위해 작업 공간과 카테고리를 모두 캐시하려고하므로 주석이 맵에 표시되기 전에 가져온 자원을 코어 데이터 테이블에 씁니다.

각 장소는 관련 카테고리 리소스를 수요에 따라 검색하므로 '장소'테이블의 장소와 '카테고리'테이블의 카테고리를 모두 작성해야합니다.

비동기 적으로 페치가 수행되기 때문에 테이블에 특정 범주를 쓰면 다른 "스레드"가 '범주'테이블에 동일한 관련 범주를 쓰려고 시도하는지 알 수 없습니다.

코어 데이터 테이블을 비동기로 검색 한 정보로 채워야 할 때 코어 데이터 테이블을 사용하기위한 패턴은 무엇입니까? 특히 범주를 작성하려고하는 주어진 스레드가 이미이를 수행하려고 시도하고 있음을 알 수 있습니까?

업데이트 1 : 현재 현재 문제는 카테고리 중복이 발생하고 있다는 것입니다. 제 생각에 분명히 쓰여지려는 각 카테고리는 동일한 카테고리의 평행 쓰기에 대해 알지 못합니다.

업데이트 2 :

내가 하나 개의 스레드에서 다른 스레드에서 그 동안 일부 필드와 새로운 종류의 개체를 만들어가와 정확히 같은 종류의 개체를 만들 : 내 경우의 가장 간단한 설명은 다음이다 첫 번째 스레드와 동일한 범주 객체를 목표로하는 동일한 필드가 있습니다. 실제 레코드가 PersistentStore 등장하기 전에 : [& 오류 managedObjectContext 저장],하지만, 두 번째는 너무 저장 전화 않습니다

하나의 스레드는 호출 승. 질문은 '카테고리'테이블에서 레코드의 중복을 방지하는 방법입니다.

UPDATE 3 : I 관리 객체 컨텍스트를 사용하여 두 변종을 고려하고 : 1) 모든 스레드 2가 하나 개의 공유 MOC 인스턴스를 재사용) 각 스레드에

덕분에 새로운 MOC의 인스턴스를!

답변

2

"공식적인"대답은 NSOperationQueue을 사용하거나 NSManagedObjectContext에 대한 모든 액세스가 컨텍스트를 만든 동일한 스레드에서 발생하는지 확인하기위한 수동 조치를 취하는 것입니다. 이 접근법을 구현하기 위해 수행 할 수있는 번호는 references and tutorials입니다.

github에는 thread-safe Core Data extension이 있습니다. 이를 사용하면 데이터베이스 작업이 자동으로 동기화되므로 다른 스레드가 컨텍스트에서 작업을 수행하고 있는지 여부를 염려 할 필요가 없습니다. 그들이 들어올 때 물건을 삽입하기 만하면 프레임 워크가 핵심 데이터가 폭발하지 않도록 작업이 변환되도록합니다.

전체 공개 : 나는 github 프로젝트를 만들었습니다.

+0

답변 해 주셔서 감사합니다. 확장 기능을 부트 스트랩하기 전에 _shared_ 컨텍스트 관리와 관련하여 문제를 열어 보겠습니다. –