2014-11-07 1 views
0

데이터 모델을 래핑하고 여러 스레드에서 액세스/수정되는 클래스가 있습니다. 데이터 모델 수정이 동기화되었는지 확인해야합니다. 나는 dispatch_queue_create (..., DISPATCH_QUEUE_SERIAL)를 사용하고 있습니다. 이것은 내 요구에 정말 잘 작동하고 있습니다.이전에 대기중인 dispatch_async에 대한 GCD dispatch_sync 우선 순위

내 클래스의 대부분의 메서드는 내부적으로 "dispatch_async (queue,^{...});"를 호출합니다. 스냅 샷 결과를 반환해야하는 곳이 몇 군데 있습니다. 이것은 어떻게 보이는지에 대한 간단한 예입니다.

- (NSArray*) getSomeData { 
    __block NSArray* result = nil; 

    dispatch_sync(queue, ^{ 
     ... Do Stuff ... 
     result = blah.blah; 
    } 

    return result; 
} 

이제 "비동기 작업 5 개"가 대기 중이며 현재 하나는 실행 중임을 가정합니다. 이제 "동기화"작업이 예약됩니다. "동기화 작업"은 언제 실행됩니까?

"동기화 작업"은 보류중인 "비동기 작업"보다 먼저 실행됩니다. 이것이 기본적으로 일어나는 일입니까? 그렇지 않다면 우선 순위 대기열에 "동기화 작업"방법이 있습니까? BTW

,

은 내가 전체 큐의 우선 순위를 설정할 수 있습니다 알고 있지만,이 질문에 대해 무엇 없습니다. 나를 위해 대기열 우선 순위 정상입니다. 비동기 작업이 보류되기 전에 동기 작업을 수행하기 만하면됩니다.

답변

2

"동기화 작업을 먼저 수행"하거나 대기열에있는 대기열 간의 상대적 우선 순위를 단일 대기열에 설정하는 일반적인 설정은 없습니다. 명확한 내용을 요약하면, 연속 대기열은 처럼 작동 할 것입니다 : 선입 선출. 즉, 여러 대기열과 대상을 사용하여이 효과를 얻는 방법을 생각해 보는 것은 매우 쉽습니다. 예를 들어 : 알

realQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL); 
asyncOpsQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL); 
dispatch_set_target_queue(asyncOpsQueue, realQueue); 

for (NSUInteger i = 0; i < 10; i++) 
{ 
    dispatch_async(asyncOpsQueue, ^{ 
     NSLog(@"Doing async work block %@", @(i)); 
     sleep(1); 
    }); 
} 

// Then whenever you have high priority sync work to do, stop the async 
// queue, do your work, and then restart it. 
dispatch_suspend(asyncOpsQueue); 
dispatch_sync(realQueue, ^{ 
    NSLog(@"Doing sync work block"); 
}); 

dispatch_resume(asyncOpsQueue); 

한 것은 그것이 시작이야 한 번 실행 블록이 효율적으로 (외부에서) 해지/정지/취소 할 수 없다는 것입니다. 따라서 동기화 블록이 시작되기 전에 비행중인 비동기 대기열에있는 모든 블록이 완료까지 실행되어야하지만, 이러한 타겟팅을 사용하면 비동기 블록의 흐름을 일시 중지하고 동기화 블록을 삽입 할 수 있습니다. 싱크 블록을 수행하는 것도 중요하지 않습니다. 마찬가지로 쉽게 비 우선적 인 비동기 블록이 될 수 있지만이 경우 dispatch_resume을 블록 자체로 옮기고 싶을 것입니다.

+0

응답 해 주셔서 감사합니다. 이것은 좋은 해결책 인 것처럼 보입니다. 나는 그것을 구현하고 어떻게 진행되는지 알려줄 것이다. – Yepher

+0

나는 그것을 구현하고 그것을 많이 테스트하고 정확히 내가 필요로하는 것을 수행한다. – Yepher