2016-06-07 2 views
1

적어도 iOS 9 이후 메인 스레드에서 실행되지 않는 코어 데이터 작업에 대한 비 비시 스레드 동시성 유형은 NSPrivateQueueConcurrencyType입니다. 코어 데이터 설정 NSManagedObjectContext 스레드 우선 순위

...:(int) neededPriority { 
    _queue = dispatch_queue_create("Worker", DISPATCH_QUEUE_SERIAL); 
    dispatch_set_target_queue(_queue, 
    dispatch_get_global_queue(neededPriority, 0)); 

때때로 나는 높은 우선 순위를 필요로, 때로는 낮은 : 내 문제는 내가 같이, 그것을 위해 스레드 우선 순위를 변경하려는 지금이다. 그러나 [_privateContext performBlock:...]을 호출 할 때 필요한 우선 순위를 가진 매개 변수를 전달할 수 없으며 문맥에 스레드 우선 순위를 설정하는 속성도 없습니다.
내 질문 : 특정 스레드 우선 순위로 컨텍스트 대기열을 넣어 어떤 방법이 있습니까?

답변

0

NSManagedObjectContext 인스턴스에는 스레드가 아니라 큐가 할당됩니다. performBlock 루틴과 연관된 대기열은 임의의 백그라운드 스레드에서 실행될 수 있으므로 일반 우선 순위를 컨텍스트에 할당 할 수 없습니다.

블록 대신 NSThread.setThreadPriority을 호출하여 해당 블록을 처리하는 스레드의 우선 순위를 변경할 수 있습니다.

변경하기 전에 스레드의 우선 순위를 저장하고 블록의 끝에서 재설정 할 수 있습니다.

+1

주 스레드에서'performBlockAndWait :'를 사용하면 큐는 주 스레드에서 블록을 실행합니다. 따라서 모든 'NSThread' 호출은 메인 스레드에 적용됩니다. –

+0

감사합니다. NSLog (@ "오래된 스레드 우선 순위 : % f", [NSThread threadPriority]); if (! [NSThread setThreadPriority : 0.1]) { NSLog (@ "우선 순위를 설정할 수 없습니다!"); } else { NSLog (@ "새 스레드 우선 순위 : % f", [NSThread threadPriority]); }'이 효과가있는 것으로 나타났습니다. – Jan