2011-08-06 3 views
6

한 번씩 "CoreData에서 오류를 수행 할 수 없습니다."라는 메시지가 나타납니다. Apple 설명서를 읽었지만 유지할 수있는 부분이 명확하지 않습니다. 우리는 스레드 당 하나의 컨텍스트를 만드는 데 매우 신중했습니다. 그러나 우리의 응용 프로그램 중 하나는 UIViewController (일반적으로 NSArray 또는 NSDictionary를 통해)에 NSManagedObjects를 유지한다는 것입니다. 개체 관계가 변화하고 있으며 적절한 알림을 처리하지 못하고 있다는 사실을 추측하고 있습니다."CoreData가 오류를 수행 할 수 없음"을 어떻게 방지합니까?

누구든지 핵심 데이터와 관련하여 더 나은 디자인에 대한 제안 사항이 있습니까? 오류가 발생하면 오류를 유발하기 위해 실제로 컨텍스트에서 아무 것도 삭제하지 못했음을 알 수 없습니다. 그들이 상태를 유지하는 경우 우리의 UIViewController NSManagedObjectContextObjectsDidChangeNotification 처리해야합니까? 모든 제안을 부탁드립니다.

+1

삭제 된 NSManagedObjects에 대한 참조가 삭제 된 뷰가 있습니다. 매우 찾기가 어렵습니다. – tjg184

답변

5

핵심 데이터에서 변경 알림을 등록 할 수 있습니다. 이렇게하면 관리 대상 객체가 변경 될 때 업데이트 할 수 있습니다. 자세한 내용은 Core Data Docs를 참조하십시오. 당신은 변화에 등록하고 응답이 방법에 관심이있을 겁니다 :

[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(mergeChanges:) 
               name:NSManagedObjectContextDidSaveNotification 
              object:(your NSManagedObjectContext)]; 

mergeChanges 선택 (당신의 방법) 다른 스레드에서 변경 사항을 동기화하기 위해 다음과 같은 방법을 호출합니다.

- (void)mergeChanges:(NSNotification *)notification{ 
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    // Merge changes into the default context on the main thread 
    [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
          withObject:notification 
         waitUntilDone:YES]; 
}