iOS Core Data의 NSManagedObjectContext

4153 단어
이 블로그를 보기 전에 먼저 인터넷에서 Core Data의 기초 지식을 익히고 영문 문서 주소인 NSManaged ObjectContext를 첨부하는 것을 권장합니다

NSManagedObjectContext


이것은 대상 공간을 표시하거나 요청, 창설, 관리 대상의 상하문을 저장하는 데 사용되는 대상이다

개술


상하문은 하나의 관련 모델 대상으로 구성되어 있는데 이러한 대상은 하나 이상의 지속적인 저장소로 구성된 내부의 일치된 보기를 나타낸다.연결된 상하문에서, 위탁 관리 대상에 대한 변경 사항은 이 상하문을 하나 이상의 지구화 저장소에 저장할 때까지 메모리에 저장됩니다.하나의 위탁 관리 대상의 실례는 하나의 상하문에만 존재하지만, 하나의 대상의 여러 부본은 서로 다른 상하문에 존재할 수 있다.따라서 객체는 특정 컨텍스트에 대해 고유합니다.

수명 주기 관리


컨텍스트는 호스팅된 객체의 라이프 사이클에 중심적인 역할을 하는 강력한 객체로, 라이프 사이클 관리(장애 관리 포함)에서 검증, 역방향 관계 처리 및 명령취소/명령복구에 이르기까지 책임이 있습니다.위아래 문장을 통해, 오래된 저장소에서 대상을 검색하거나 '가져오기' 하여 변경하고, 변경 사항을 버리거나, 위아래 문장을 통해 오래된 저장소로 제출할 수 있습니다.상하문은 대상의 변경 사항을 감시하고 취소 관리자를 유지하여 취소와 복구를 더욱 세밀하게 제어할 수 있도록 합니다.새 대상을 삽입하고 가져온 대상을 삭제하고 변경 사항을 영구 저장소에 제출할 수 있습니다.외부 저장소에서 얻은 모든 대상은 상하문에 등록되어 있고 전역 식별자 NSManagedObjectID 의 실례가 있습니다. 모든 대상을 외부 저장소로 표시하는 데 사용됩니다.

상위 스토리지


위탁 관리 대상의 상하문에는 부모 저장소가 있는데 부모 저장소를 통해 위탁 관리 대상을 나타내는 데이터를 검색하고 이 데이터를 통해 위탁 관리 대상에게 변경 사항을 제출한다.OS X v10.7 및 iOS v5.0 이전에는 부모 스토리지가 항상 지속적인 스토리지 조정자였습니다.macOS 10.7 이후 iOS v5.0과 그 이후에 부모 저장소는 다른 위탁 관리 대상의 상하문이 될 수 있다.최종적으로, 상하문 루트 저장소는 반드시 지속적인 저장소 조정기여야 한다.조정기는 트랜잭션 대상 모델을 제공하고 데이터를 포함하는 각종 지속적인 저장소에 요청을 보냅니다.만약 상하문의 부모 저장소가 다른 위탁 관리 대상의 상하문이라면, 가져오고 저장하는 작업은 조율 프로그램이 아니라 부모 상하문에서 제어한다.이 모드에는 다음과 같은 여러 장면이 사용됩니다.
  • 두 번째 스레드 또는 대기열에서 백그라운드 작업을 수행합니다.
  • 관리자의 윈도우나 뷰에서 삭제할 수 있는 편집을 관리합니다.

  • 첫 번째 장면에서 보듯이 부모 상하문은 서로 다른 라인에서 온 하위 라인의 요청에 서비스를 제공할 수 있다.따라서 루트 제약 형식과 함께 만든 부모 상하문을 사용할 수 없습니다. (아래의 '병발성' 참조)컨텍스트에서 변경 내용을 저장하면 변경 내용은 단일 저장소로만 제출됩니다.하위 컨텍스트를 저장하면 변경 내용이 상위 컨텍스트로 밀어넣습니다.루트 상하문을 저장하기 전에 변경 사항을 영구 저장소에 저장하지 않습니다.루트 관리 객체 컨텍스트는 상위 컨텍스트가 nil인 컨텍스트입니다.또한 저장하기 전에 부모 요소는 하위 요소에서 변경 사항을 추출하지 않습니다.변경 사항을 최종적으로 제출하려면 하위 상하문을 저장해야 합니다.

    통지하다


    상하문은 서로 다른 점에서 알림을 발표한다. 예를 들어 참고NSManagedObjectContextDidSaveNotification의 예를 들어 일반적으로 당신은 이미 알고 있는 상하문에서 이 알림을 받도록 등록해야 한다.
    [[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector()
                                      name:NSManagedObjectContextDidSaveNotification
                                      object:];
    

    일부 시스템 프레임워크는 내부적으로 Core Data를 사용합니다.모든 상하문에서 이 알림을 등록해서 받으면 (nil을 대상 매개 변수로 addObserver:selector:name:object: 처리하기 어려운 의외의 알림을 받을 수 있습니다.

    병발성


    Core Data는 스레드(또는 서열화된 대기열) 제약을 사용하여 위탁 관리 대상과 관리 대상의 상하문을 보호한다(Core Data 프로그래밍 안내서 참조).그 결과, 상하문에서 기본 소유자가 그 라인이나 대기열을 분배한다고 가정하면, 이것은 그 init 방법을 호출하는 라인에 의해 결정된다.따라서 한 라인에서 상하문을 초기화한 다음에 다른 라인에 전달해서는 안 된다.반대로, 인용을 영구 메모리 조정기에 전달하고, 수신 루트/대기열을 파생된 새로운 상하문을 만들어야 합니다.NSOperation을 사용하는 경우 main (직렬 대기열) 이나 start (병렬 대기열) 에서 상하문을 만들어야 합니다.
    컨텍스트를 작성할 때 사용 중인 동시 모드initWithConcurrencyType:를 지정합니다.initWithConcurrencyType: 위탁 관리 대상의 상하문을 만들 때, 루트 (대기열) 연결에 사용할 두 가지 옵션이 있습니다.
  • 대기열 관리 대상의 상하문에 있는 Setter 방법은 라인이 안전합니다.모든 라인에서 이 방법을 직접 호출할 수 있습니다.
  • 코드가 주 스레드에서 실행되면 블록 기반 API 대신 주 대기열 스타일 컨텍스트에서 메인프레임 방법을 직접 호출할 수 있습니다.
  • performBlock:performBlockAndWait:는 상하문에 지정된 대기열에서 블록 작업을 실행해야 한다.performBlock: 방법은 즉시 되돌아오고 상하문은 자신의 라인에서 블록 방법을 실행한다.performBlockAndWait: 방법을 사용하면 상하문은 여전히 자신의 라인에서 블록 방법을 실행하지만 방법은 블록을 실행하기 전에 되돌아오지 않습니다.
    블록은 서로 다른 작업체로서 집행된다는 것을 이해하는 것이 중요하다.블록이 끝나면 다른 블록의 대기열 생성, 변경 취소, 컨텍스트 재설정 등을 수행할 수 있습니다.따라서 블록이 상당히 클 수 있습니다. 보통save를 호출해서 끝냅니다.
    __block BOOL savedOK = NO;
    [myMOC performBlockAndWait:^{
    // Do lots of things with the context.
    NSError *error = nil;
    if (![myMOC save:&error]) {
        NSLog(@"Error saving: %@", error);    } else {
        savedOK = YES;
    }
    }];
    

    You can also perform other operations, such as:
    NSFetchRequest *fr = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
    __block NSUInteger rCount = 0;
    
    [context performBlockAndWait:^() {
    NSError *error;
    rCount = [context countForFetchRequest:fr error:&error];
    if (rCount == NSNotFound) {
        // Handle the error.
    }}];
    NSLog(@"Retrieved %d items", (int)rCount);
    

    좋은 웹페이지 즐겨찾기