3

Employee 엔티티와 일대 다 관계가있는 Department 엔티티가 있습니다. 런타임 동안 각 Department 객체에 대해 다양한 뷰 객체에서 모델로 사용되는 Employee 객체 (정렬 된 일부 속성에 따라 정렬 됨)의 정렬 된 배열을 유지하려고합니다.핵심 데이터 배경 정렬

Rep1 : 내가 정렬 된 배열 표현하는 방법은 두 가지가 읽은 것을에서

(정렬이 코어 데이터에 의해 이루어집니다) Department에서 가져온 속성을 정의하는가;

Rep2 :학과 (Employee 객체의 NSArray) sortedEmployees 변수 인스턴스 (정렬이 내 코드에 의해 수행)을 유지.

이제 내 진짜 문제는 응용 프로그램을 시작할 때 영구적 인 저장소에서 가져올 DepartmentsEmployees의 수가 많습니다. 백그라운드에서 정렬을 수행하여 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 (및 연관된 관리 객체)를 가져야하기 때문입니다.

그래서 관리 대상 개체가 스레드 경계를 넘어 존재할 수없는 경우 어떻게 하나의 관리 대상 개체를 백그라운드에서 정렬합니까? 내가 놓친 게 있니?

답변

1

Pius,

아무 것도 없습니다. 정렬 된 배열을 새 MOC로 변환하면됩니다.다음은 조각입니다.

NSMutableArray *ma = [NSMutableArray arrayWithCapacity: array.count]; 

for (mo in array) { 

    [ma addObject: [moc objectWithID: mo.objectID]]; 
} 
return ma; 

이렇게하면 배열이 마이그레이션됩니다. 내가 알기에 이것은 효율적인 과정이다. 또한 고성능 액세스를 위해 행 캐시에 의존 할 수 있습니다.

앤드류

+0

감사합니다. 행 캐시에 따라 무엇을 의미하는지 자세히 설명해 주시겠습니까? 어떤 행 캐시? – Pius

+0

또한 앞서 언급 한 어레이 마이그레이션을 어느 스레드에서 수행해야합니까? 메인 스레드의 경우 "mo"가 무효화되지 않으므로 mo.objectID에 액세스 할 때 오류가 발생합니까? 백그라운드 스레드의 경우, moc가 메인 스레드에 속하기 때문에 [moc objectWithID : ...]에 액세스 할 수 없습니까? – Pius

+0

Pius, 행 캐시는 영구 저장소 조정자가 유지 관리합니다. 자동 성능 최적화입니다. 당신은 그것을 유지하지 않습니다 - 코어 데이터 않습니다. 대상 스레드에있을 때 일반적으로 ID를 변환합니다. Andrew P.S. 이 답변이 마음에 들면 "올바른"대답으로 선택하십시오. – adonoho

관련 문제