새로운 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
처럼 보입니다. 컨텍스트는 새 컨텍스트를 생성하기 위해 부모에서 영구 코디네이터를 가져 오는 것처럼 보입니다. 그리고 NSPrivateQueueConcurrencyType
init에 지정 하면 performBlock
매개 변수가 개인 큐에서 실행 되는지 확인할 수 있습니다.
새 API는 입력 할 코드가 훨씬 적지 않은 것 같습니다. '전통적인'스레딩에 비해 어떤 이점이 있습니까?
'code' 카테고리의 다른 글
QueueFile 테이프를 읽을 때 EOFException 발생 (0) | 2020.12.26 |
---|---|
ElastiCache와 함께 SignalR 사용 실패 (0) | 2020.12.26 |
D3 및 Shiny를 사용하여 R에서`identify ()`구현 (0) | 2020.12.26 |
특성에 대한 알림을 설정하면 잘못된 핸들 오류가 발생 함 (0) | 2020.12.26 |
FFmpeg를 사용하여 iOS에서 작성하는 동안 fMP4를 HLS로 트랜스 코딩 (0) | 2020.12.26 |