2014-10-15 5 views
1

동일한 데이터 모델을 사용하는 두 개의 Managed Object Context가 있습니다. 유일한 차이점은 하나는 읽기 전용이고 다른 하나는 읽기/쓰기입니다. 나는이 두 관리 객체 컨텍스트 중 하나에있을 수있는 객체를 검색하려고합니다. 그래서 나는 fetchrequest를 만들고 관리 된 객체 컨텍스트 모두에서 fetchrequest를 사용하려고합니다.2 개의 ManagedObjectContext에서 하나의 FetchRequest

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 
[fetchRequest setIncludesPendingChanges:YES]; 
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name=%@", name]; 

NSError *error = nil; 
NSArray *privateobjects = [self.privateManagedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (privateobjects && privateobjects.count > 0) 
{ 
    return privateobjects[0]; 
} 

NSArray *publicobjects = [self.publicManagedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (publicobjects && publicobjects.count > 0) 
{ 
    return publicobjects[0]; 
} 

return nil; 

위 코드는 공용 관리 객체 컨텍스트의 결과를 반환하지 않습니다. fetchrequest를 다시 작성하여이 문제를 해결할 수 있습니다. 그래서 내 질문에, 왜 하나의 fetchrequest가 관리 객체 환경에서 작동하지 않습니까?

편집 : fetchrequest는 두 개의 컨텍스트가 저장 될 때 관리되는 개체 컨텍스트 모두에서 작동하는 것으로 보입니다. 보류중인 변경 사항을 검색 할 때마다 public (두 번째) 컨텍스트는 결과를 반환하지 않습니다.

답변

2

. NSFetchRequest(entityName:)은 실제로 특정 NSEntityDescription 인 가져 오기 요청의 축약이지만 관리되는 개체 컨텍스트는 포함하지 않습니다. NSManagedObjectContext 메소드로 가져 오기 요청을 실행할 때 마지막 순간에 입력 된 컨텍스트입니다. (NSEntityDescription 팩토리 메소드에는 컨텍스트가 포함됩니다.)

그래서 "불완전한"가져 오기 요청을 반환하고 다른 컨텍스트에서 사용하는 편리한 방법을 만들려고 할 수 있습니다. (이 방법이 효과가 있을지는 모르겠지만 코드가 2-3 줄 정도 저장됩니다. 또는 반입 요청을 다시 작성하기위한 코드를 다시 작성하십시오.

+0

고맙습니다! "마지막 순간에 NSManagedObjectContext 메서드를 사용하여 가져 오기 요청을 실행할 때 컨텍스트가 채워집니다 (NSEntityDescription 팩터 리 메서드에 컨텍스트가 포함됨)." 그게 바로 제가 찾고 있던 것입니다. –

0

NSFetchRequest 인스턴스에 데이터 변경 알림을 추가해야합니다.

차이점 fetchRequest가 변경되면 NSFetchedResultsControllerDelegate 대리자가 사용됩니다. 처럼 대리인 코드가 될 수있다 : 당신이 그것을 관리되는 개체 컨텍스트에 의존하기 때문에 두 번 가져 오기 요청을 만들 필요가 있다고 생각

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    { 
     [[NSNotificationCenter defaultCenter] postNotificationName:kNotification_LocalContactStorageSaved 
                  object:nil]; 
    } 

    #pragma mark - context merge from other MOC 

    - (void)contextDidSave:(NSNotification *)notification 
    { 
     NSManagedObjectContext *sender = (NSManagedObjectContext *)[notification object]; 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       [managedObjectContext_localContacts mergeChangesFromContextDidSaveNotification:notification]; 
      }); 
    } 
+0

나는 당신이 여기서 무엇을 해결하려고하는지 전혀 모른다. 내 문제는 NSFetchedResultsController와 관련이 없으며 컨텍스트가 독립적이므로 병합되지 않습니다. – ggfela

+0

개인 관리 컨텍스트에서 저장을 사용하여 변경 내용을 저장소에 저장할 수 있습니다. 공용 사용자가 스토어에서 데이터를 가져옵니다. 캐시되지 않습니다. –

+0

그냥 테스트했습니다. 첫 번째 컨텍스트 만 저장하면 두 번째 컨텍스트에서 보류중인 변경 내용을 검색 할 수 없습니다. – ggfela