code

새로운 NSPrivateQueueConcurrencyType을 통한 핵심 데이터 백그라운드 가져 오기

codestyles 2020. 12. 26. 10:05
반응형

새로운 NSPrivateQueueConcurrencyType을 통한 핵심 데이터 백그라운드 가져 오기


이제 iOS5에서 정말 간단합니까?

AppDelegate에서이 코드를 사용하여 백그라운드 가져 오기를 수행했습니다.

dispatch_queue_t downloadQueue = dispatch_queue_create("DownloadQueue", NULL);
dispatch_async(downloadQueue, ^{
        self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:self.managedObjectContext];
        [self.myDownloadClass download];
    });

dispatch_release(downloadQueue);

내 다운로드 클래스는 일부 XML 데이터를 가져 오기 위해 NSURLConnection을 수행하고 NSXMLParser를 사용하여 데이터를 구문 분석 한 다음 핵심 데이터에서 복잡한 스키마를 업데이트합니다. 저는 항상 주 스레드로 전환하여 실제로 핵심 데이터를 업데이트합니다. dispatch_sync (dispatch_get_main_queue () ....에 대한 많은 호출이있는 지저분한 코드

내 새 코드는 다음과 같습니다.

NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.managedObjectContext];

[child performBlock:^{
    self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:child];
    [self.myDownloadClass download];
    }];

부모 모델 개체 컨텍스트 유형을 NSMainQueueConcurrencyType으로 설정하기 위해 AppDelegate의 다른 코드에 대한 작은 변경 사항과 함께 :

- (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

아주 잘 작동하는 것 같습니다. 전체 업데이트 프로세스는 여전히 별도의 스레드에서 실행되지만 스레드를 만들 필요는 없었습니다. 마법 같네요.

물리적 코어 데이터 파일에 대한 변경 사항을 커밋하려면 부모 컨텍스트에서도 save :를 호출해야합니다.

나는 여기서 정말로 질문하지 않았다. 새로운 iOS5 관리 개체 컨텍스트 메서드를 검색 할 때 찾은 모든 내용은 코드 예제없이 높은 수준의 세부 정보 만 제공하고 백그라운드에서 핵심 데이터를 가져 오는 다른 모든 검색은 오래되고 때로는 매우 오래 되었기 때문에이 게시물을 게시하고 있습니다. , iOS5 이전에 수행하는 방법에 대해 논의하십시오.


예-정말 쉽습니다 (iOS 5.0에서). iOS 4 호환성의 경우 이전의 장애물이 남아 있지만 문서는 스레드 제한에 대해 그리 나쁘지 않습니다. 위키 섹션에 추가해야할까요?


이 새로운 API가 어떻게 구현되는지 이해하려고합니다. 다중 스레드 코어 데이터에 대한 일반적인 패턴은 다음과 같습니다.

일반적 으로이 예제에서는 다음을 NSOperation사용하여 단순화 dispatch_async되었습니다.

dispatch_queue_t coredata_queue; // some static queue

dispatch_async(coredata_queue, ^() {
    // get a new context for this thread, based on common persistent coordinator
    NSManagedObjectContext *context = [[MyModelSingleton model] threadedContext];

    // do something expensive

    NSError *error = nil;
    BOOL success = [context save:&error];
    if (!success) {
        // the usual.
    }

    // callback on mainthread using dispatch_get_main_queue();
});

그런 다음 메인 스레드는 NSManagedObjectContextDidSaveNotification메인 컨텍스트 병합을 기반으로 UI를 업데이트하여 응답합니다 .

새 API는이 패턴을 둘러싼 래퍼 child처럼 보입니다. 컨텍스트는 새 컨텍스트를 생성하기 위해 부모에서 영구 코디네이터를 가져 오는 것처럼 보입니다. 그리고 NSPrivateQueueConcurrencyTypeinit에 지정 하면 performBlock매개 변수가 개인 큐에서 실행 되는지 확인할 수 있습니다.

새 API는 입력 할 코드가 훨씬 적지 않은 것 같습니다. '전통적인'스레딩에 비해 어떤 이점이 있습니까?

참조 URL : https://stackoverflow.com/questions/8305227/core-data-background-fetching-via-new-nsprivatequeueconcurrencytype

반응형