2013-02-20 1 views
2

NSOperation 및 NSOperationQueue (2D 게임용)를 사용하여 백그라운드에서 이미지를로드하고 있습니다. 방법 NSOperations을 이해하려면NSOperationQueue 관련없는 NSOperationQueue를 차단 하시겠습니까?

(나는 모든 이미지의로드를 시작하기 전에 -startNewEndlessBackgroundTask 방법 전화) 나는 다음과 관련이없는 NSOperationQueue/NSOperation를 추가 해봤 동작 : 이미지 로딩을위한

static int stop = NO; 
static int c = 1000; 
-(void)takeTime { 
    stop = NO; 
    while (!stop) { 
     for (int i = 0; i < 10000; i++) { 
      c += 1; 
     } 
     c = c; 
    } 
} 
-(void)stopBackgroundTask { 
    stop = YES; 
} 
-(void)startNewEndlessBackgroundTask { 
    //[self performSelectorInBackground:@selector(takeTime) withObject:nil]; 
    NSOperationQueue* queue = [[NSOperationQueue alloc] init]; 
    [queue addOperationWithBlock:^{ 
     [self takeTime]; 
    }]; 
} 

이 완전히 블록 내 다른 NSOperationQueue를 iPhone4에서. iPhone4s에서는 startNewEndlessBackgroundTask를 2 번 호출하면 이미지 로딩이 차단됩니다. 둘 다 iOS 6을 실행 중입니다.

내 앱의 메인 루프가 차단되지 않았습니다.

대신 performSelectorInBackground를 사용하여 takeTime을 호출하면 모든 것이 차단없이 작동하고 takeTime 루틴도 백그라운드에서 올바르게 작동합니다.

왜 두 개의 NSOperationQueue가 완전히 별도로 alloc-init'ted이고 종속성이없는 경우 이런 일이 발생할 수 있습니까? 나에게있어,이 간단한 방법으로 NSOperationQueue를 사용하는 것과 performSelectorInBackground를 사용하는 것 사이의 차이가 없어야한다. 그러나 내가 오해하고있는 근본적인 것이 있다고 생각한다.

답변

0
세부 사항에 대해 확실하지

, 그러나 이것은 내가 지금 무슨 일이 일어나고 어떻게 생각하는지에 대한 부분 답변입니다 ..

는 NSOperation은 아래 GCD를 사용합니다 (적어도 OSX 및 iOS의 마지막 몇 버전부터). GCD에는 특정 전역 우선 순위 대기열이 있습니다.

우선 순위가 높은 대기열에 작업이있는 경우 우선 순위가 낮은 대기열의 작업도 시작되지 않습니다 (같은 글로벌 우선 순위 대기열의 작업은 이름에 "대기열"이 있음에도 불구하고 시작될 수 있음). 기본 우선 순위 대기열은 동시 가능).

스레드 우선 순위를 지정하지 않았으므로 -takeTime 작업이 기본 우선 순위 대기열에서 예약되고 이미지로드 작업이 기본 우선 순위 대기열에서 예약 된 것으로 상상합니다. 이것은 왜 takeTime 연산이 이미지 로딩을 막고 있는지 설명 할 것이다.

우선 순위가 높은 대기열의 작업을 기다리는 낮은 우선 순위 대기열의 작업에 대해 언급하지 않은 채로 iPhone4s에서 이미지로드 작업을 차단하는 데 두 건의 -takeTime 작업이 필요합니다. CPU 코어 수에 따라 달라질 수 있습니다. 지금까지 문서에서 보았습니다.

Apple - Dispatch Queues : "기본 동시 큐를 받고뿐만 아니라, 당신이 대신 함수에 DISPATCH_QUEUE_PRIORITY_HIGH 및 DISPATCH_QUEUE_PRIORITY_LOW 상수를 전달하여 높은 및 낮은 우선 순위 수준 큐를 얻을 수 있습니다, 또는 전달하여 배경 큐를 얻을 수 DISPATCH_QUEUE_PRIORITY_BACKGROUND 상수가 있습니다. 우선 순위가 높은 동시 대기열의 작업은 기본 및 우선 순위가 낮은 대기열의 작업보다 먼저 실행되고, 마찬가지로 기본 대기열의 작업은 우선 순위가 낮은 대기열의 작업보다 먼저 실행됩니다.