2013-10-17 1 views
4

NSMainQueueConcurrencyType에서 performBlockAndWait까지 NSManagedObjectContext이 가능한 것으로 나타났습니다. 수신자의 (메인) 대기열 이외의 대기열에서 차단을 실행하십시오.NSManagedObjectContext의 performBlockAndWait : 수신자의 대기열에서 실행되지 않음

예를 들어, 내 parentContext 유형 NSMainQueueConcurrencyType이며 내 childContext 유형 NSPrivateQueueConcurrencyType의 경우 childContext의 큐의 블록을 실행 내 parentContext 다음 코드 결과 :

이에
[childContext performBlockAndWait:^{ 
    //Thread 1, Queue: NSManagedObjectContext Queue 
    [parentContext performBlockAndWait:^{ 
     //Thread 1, Queue: NSManagedObjectContext Queue 
     //This is the same queue as the child context's queue 
    }]; 
}]; 

다음 이 특급인가

[childContext performBlock:^{ 
    [parentContext performBlockAndWait:^{ 
     //Thread 1, Queue: com.apple.main-thread 
    }]; 
}]; 

: 내 parentContext 메인 큐에 블록을 실행 - 코드는 예상대로 작동 행동이 바뀌 었습니까? 그것은 문서 상태로 인해 나를 혼란스럽게합니다. "performBlockAndWait: synchronously performs a given block on the receiver’s queue."

+0

코드가 실행되는 큐를 확인하려면 어떻게합니까? –

답변

3

실행되는 스레드 블록에 대해 걱정할 필요가 없습니다. performBlock:performBlockAndWait: 메서드가 보장하는 것은 스레드 안전입니다. 따라서 기본 스레드에서 performBlockAndWait:을 호출한다고해서 백그라운드 스레드로의 컨텍스트 전환이 발생한다는 것을 의미하지는 않습니다. 매우 비싸고 필요하지 않습니다. 블록 (메인 쓰레드상의)의 동작 중에 블럭을 수행하려는 시도가 수행되면, 현재 실행중인 블럭이 종료 될 때까지 블로킹된다. 결국 컨텍스트 전환이 수행 된 경우와 마찬가지로 결과가 더 빨리 나타납니다. 반면에 performBlock:을 호출하면 종종 백그라운드 스레드에서 실행되는 임의의 대기열에 블록을 대기열에 넣습니다.

performBlockAndWait: 위 예제에서 개인 대기열 컨텍스트는 주 컨텍스트 블록과 마찬가지로 주 스레드에서 블록을 실행합니다. 두 번째 예제에서는 비동기 적으로 실행되도록 블록을 예약하므로 백그라운드 스레드에서 실행됩니다.

스레드의 대기열을 이름으로 판단하면 안됩니다. 기본 대기열에 있는지 확인하려면 dispatch_get_current_queue()을 사용하고 dispatch_get_main_queue()과 같은지 테스트하십시오.

+2

동작이 dispatch_get_current_queue가 사용되지 않는 이유 인 경우이 종류입니다. 기본적으로, 현재 대기열의 신원에 관심이 있다고 생각된다면 항상 올바른 대답이있는 것은 아니기 때문에 아마도 뭔가 잘못하고있는 것입니다. –

+0

예, 동의합니다. 코드를 올바르게 작성하면 문제가 없습니다. –

+1

이것은 내 질문에 실제로 대답하지 않습니다. 명확하게, 내 질문은 : 왜'NSMainQueueConcurrencyType'을 가진'NSManagedObjectContext'는 문서 상태 일 때 메인 큐가 아닌 다른 큐에서'performBlockAndWait :'블록을 실행합니다. performBlockAndWait : 수신자의 대기열입니다. "이 경우 수신자의 대기열이 기본 대기열이어야합니다. 위에 표시된 것처럼 항상 메인 큐가 아니라는 것을 확인했습니다. –

관련 문제