Employee
엔티티와 일대 다 관계가있는 Department
엔티티가 있습니다. 런타임 동안 각 Department
객체에 대해 다양한 뷰 객체에서 모델로 사용되는 Employee
객체 (정렬 된 일부 속성에 따라 정렬 됨)의 정렬 된 배열을 유지하려고합니다.핵심 데이터 배경 정렬
Rep1 : 내가 정렬 된 배열 표현하는 방법은 두 가지가 읽은 것을에서
(정렬이 코어 데이터에 의해 이루어집니다) Department
에서 가져온 속성을 정의하는가;
Rep2 :학과 (Employee
객체의 NSArray
) sortedEmployees
변수 인스턴스 (정렬이 내 코드에 의해 수행)을 유지.
이제 내 진짜 문제는 응용 프로그램을 시작할 때 영구적 인 저장소에서 가져올 Departments
및 Employees
의 수가 많습니다. 백그라운드에서 정렬을 수행하여 UI를 차단하지 않기를 원합니다. , 모든 Departments
인출 한 후 각각의 가져온 속성을 실행 (AN NSOperationQueue
사용) 백그라운드 스레드에서 (Rep1 사용)
방법 항목 :
나는 모두가 무용에 결국 여러 가지 방법을 시도했습니다. 그런 다음 주 스레드로 돌아가서 주 스레드의 관리 대상 개체 컨텍스트 (MOC) (NSManagedObjectID)에 해당하는 Department
개체를 찾아 fetched 속성을 사용합니다. Method1 문제 : 백그라운드 부서의 가져 오기가 완료된 후에도 주 스레드의 Department 개체에서 가져온 속성이 채워지지 않습니다. 즉, 주 스레드의 Department 개체에서 다시 가져온 것입니다. 이것은 배경 가져 오기의 모든 목적을 무효화합니다. 한 번 가져온 가져온 속성이 모든 MOC에 있다고 가정하는 것은 잘못된 것입니까? (Rep2 사용)
방법 2 : (AN NSOperationQueue
사용) 배경 스레드는 모든 Departments
반입 한 후 각각의 sortedEmployees
어레이를 계산한다. 그런 다음 주 스레드로 돌아가서 메인 스레드의 MOC (NSManagedObjectID)의 해당 Department 개체를 찾고 은이 개체를으로 설정합니다. Method2 문제 : sortedEmployees
배열의 개체는 Employee
이고 배경 스레드의 MOC에 속합니다. 주 스레드가 나중에 액세스하려고 시도 할 때 "NSManagedObject with ID ... has been invalidated."
과 같은 충돌이 발생합니다. 이는 각 스레드가 자체 MOC (및 연관된 관리 객체)를 가져야하기 때문입니다.
그래서 관리 대상 개체가 스레드 경계를 넘어 존재할 수없는 경우 어떻게 하나의 관리 대상 개체를 백그라운드에서 정렬합니까? 내가 놓친 게 있니?
감사합니다. 행 캐시에 따라 무엇을 의미하는지 자세히 설명해 주시겠습니까? 어떤 행 캐시? – Pius
또한 앞서 언급 한 어레이 마이그레이션을 어느 스레드에서 수행해야합니까? 메인 스레드의 경우 "mo"가 무효화되지 않으므로 mo.objectID에 액세스 할 때 오류가 발생합니까? 백그라운드 스레드의 경우, moc가 메인 스레드에 속하기 때문에 [moc objectWithID : ...]에 액세스 할 수 없습니까? – Pius
Pius, 행 캐시는 영구 저장소 조정자가 유지 관리합니다. 자동 성능 최적화입니다. 당신은 그것을 유지하지 않습니다 - 코어 데이터 않습니다. 대상 스레드에있을 때 일반적으로 ID를 변환합니다. Andrew P.S. 이 답변이 마음에 들면 "올바른"대답으로 선택하십시오. – adonoho