2017-09-14 3 views
0

CoreData 관계를 지연로드하는 올바른 방법은 무엇입니까?게으른로드 CoreData 관계

나는 이미 존재할 수도 있고 없을 수도있는 Project 개체와 ProjectFilter 개체가 있다고 가정하면이 개체는 예상대로 작동합니까?

- (ProjectFilter *)filter 
{ 
    [self willAccessValueForKey:@"filter"]; 
    ProjectFilter *filter = [self primitiveValueForKey:@"filter"]; 
    [self didAccessValueForKey:@"filter"]; 

    if (!filter) { 
     filter = [NSEntityDescription insertNewObjectForEntityForName:@"ProjectFilter" inManagedObjectContext:self.managedObjectContext]; 
     self.filter = filter; 
    } 
    return filter; 
} 

답변

1

이것은 끔찍한 생각이므로 무시하면됩니다.

매우 간단한 코어 데이터 스택에서 모든 것을 메인 스레드에서 실행할 수 있습니다. 그러나 앱이 복잡해지면 거의 언제나 배경 컨텍스트가 있어야합니다. 코어 데이터에 다중 컨텍스트 쓰기를 동시에 수행하면 병합 충돌이 발생할 수 있습니다. 병합 된 충돌을 자동 해결하도록 코어 데이터에 알릴 수 있지만 그렇게하면 데이터를 잃어 버릴 수 있으므로 큰 해결책은 아닙니다. 그래서 일반적인 해결책은 쓰기를위한 하나의 큐를 가지고 읽기를 위해서만 메인 쓰레드 큐를 사용하는 것입니다.

설정에서 핵심 데이터에 쓰고 있다는 사실을 숨기고 있습니다. 따라서 project.filter에 액세스하면 핵심 데이터에 쓰기가 발생합니다. 코어 데이터를 작성하는 위치와 시간을 관리하려고하는 경우 개발자가이를 쓰기로 인식하는 것은 매우 어렵습니다.

코어 데이터가이 설정을 사용하지 않더라도 개발자가 코어 데이터에 쓰는 시점을 아는 것이 중요합니다. 쓰기 후에는 저장해야합니다. 쓰기 후에 가져온 결과 컨트롤러에 영향을 미친다는 것을 알아야 할 수도 있습니다. 쓰기 후에 병합 된 충돌을 얻을 수 있습니다.

+0

좋은 점은 다음에 더 나은 접근 방법이 무엇일까요? – trapper

+0

메소드'createFilterPropertyIfNeeded'가 바람직합니다. –