2011-02-10 5 views
0

코어 데이터는 오브젝트를 지연로드하며 참조를 시도하자마자 오브젝트를 가져옵니다. 그러나 나는이 계획에 몇 가지 문제가 발생했습니다.코어 데이터 지연로드 문제

목표 (집합의 개체가 아직로드되지 않았기 때문에) 관계 (집합)의 개체에 대한 C 2.0 빠른 열거 형은 실패 할 수 있으며 핵심 데이터가 관리하는 개체의 멤버를 만질 때까지 awakeFromFetch가 호출되지 않습니다 . 예를 들어

, I와 같은 NSManagedObject의 서브 클래스에 관계가있는 경우 :

@property (retain) NSSet* clips; 

즉시 해당 오브젝트의 인스턴스를 인출 한 후 I는 이와 같은 빠른 열거를 사용하려고하는 경우 :

for (PClip* clip in self.clips) { 
    // do something with the clip 
} 

루프 본문이 실행되지 않습니다. 디버거에서 클립 세트 (런타임에 _NSFaultingMutableSet의 인스턴스)가 처음에는 비어 있음을 볼 수 있습니다.

또는 내가 영속 상태에서 파생 된 클립 객체의 비 영구적 인 구성원이 있다고 :

@property (retain) NSString* filename 

내가 awakeFromFetch 사용 방법이 동기화를하지만, awakeFromFetch 일부 지속 멤버까지 호출되지 않습니다 객체가로드되기 전에 일부 코드가이 비 영구적 값에 액세스하려고하면 아직 정의되지 않습니다 (즉, nil이됩니다).

페치 요청에서 setReturnsObjectsAsFaults : 메서드를 사용하면 도움이되지 않습니다. 페치 된 객체에 첨부 된 객체 트리를 모두 가져 오도록 강제하는 것은 아닙니다.

개체를 작업하기 전에 개체를로드하는 가장 좋은 방법은 무엇입니까? 빠른 열거로 인해 개체 집합이로드되지 않는 이유는 무엇입니까?

+0

나중에 "{}"편집기 컨트롤을 사용하여 질문에 맞게 코드의 형식을 지정하십시오. :-) –

답변

0

(해킹이되는 것 같지만) 효과가있는 것처럼 보이는 것은 최상위 수준 개체의 awakeFromFetch 메서드에서 개체의 전체 트리를 통과시키는 것입니다. 예를 들어

:

-(void) awakeFromFetch { 
    // accessing the count of each relationship forces the set of objects to load 
    self.clips.count; 
    for (PClip* clip in self.clips) { 
     // access a persistent member of each object, which will cause 
     // its awakeFromFetch method to be called 
     clip.pathURL;  
    } 
} 
1

당신이

for (PClip* clip in self.clips) { 
    // do something with the clip 
} 

for (PClip* clip in clips) { 
    // do something with the clip 
} 

을 어떻게 대체됩니까? 인스턴스 변수와 같은 coredata 값을 사용할 수 없으므로 setter 및 getter를 사용해야합니다. getter는 핵심 데이터에서 값을 가져올 것이기 때문입니다.

그런 다음 처음 액세스 할 때 개체를 만드는 파일 이름에 대한 getter를 만들어보십시오.

내 경험에 의하면 awakeFromFetch에서 아무 것도 할 필요가 없습니다.

+0

죄송합니다, 그건 단순히 내 부분에 누락되었습니다. 나는 그 문제를 수정하기 위해 편집했다. – CuriousKea

1

기본적으로 관리되는 개체의 속성이로드됩니다.관계를로드 할 수
, 당신은 같은 것을 할 수 있습니다 FRC를 사용하는 경우,
NSArray *relationshipKeys = [NSArray arrayWithObject:@"clips"];
[fetchRequest setRelationshipKeyPathsForPrefetching:relationshipKeys];

0

@CuriousKea 그냥 팁, 당신은 awakeFromFetch의 관계를 설정하지 않아야합니다. 설정 관계로 인해 FRC가 다시 통보되고 FRC 대표가 두 번 호출되기 때문입니다. 성능이 안좋아.