예를 들어 3 개의 비동기 블록이있는 메소드가 있습니다. 각 블록 결과는 최종 블록 결과를 얻기 위해 다음 블록을 수행하는 데 필요합니다. 그래서, 내가 무엇을 찾고있어 엄격한 위해 죽은 잠금비동기 블록 완료 대기
__block id task1Result;
__block id task2Result;
__block id finalResult;
[self startTask1:^(id result) { task1Result = result }]
[self startTask2:task1Result block:^(id result) { task2Result = result }]
[self startTask3:task2Result block:^(id result) { finalResult = result }]
UPD없이 수행 make'em에 좋은 GCD 전략이다. 나는 해결책 발견 :
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block id task1Result;
__block id task2Result;
__block id finalResult;
[self startTask1:^(id result) {
task1Result = result;
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
[self startTask2:task1Result block:^(id result) {
task2Result = result;
dispatch_semaphore_signal(sem);
}];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
[self startTask3:task2Result block:^(id result) { finalResult = result }];
을하지만 내 경우에는 내가 교착하는 응용 프로그램을 제공합니다 일부 라이브러리 방법에 문제에 직면했다. 여기에 설명처럼> <
세마포어를 사용하지 마십시오. 이는 우선 순위 역전으로 쉽게 이어질 수있는 최악의 해결책입니다. 직렬 대기열을 사용하여 작업을 직렬화하십시오. –
내 경우에 내가 어떻게 사용해야하는지에 대한 예제 코드를 줄 수 있습니까? –
직렬 대기열을 작성하고 블록을 제출하십시오. 그들은 순서대로 처형 될 것입니다. dogsgod는 당신에게 아래에보기를 주었다. –