나는 수행하고있는 dispatch_async 시리즈를 가지고 있으며, 모두 완료 될 때 UI 만 업데이트하려고합니다. 문제는 dispatch_async 내의 메서드가 별도의 스레드에서 무언가를 호출하기 때문에 데이터가 완전히로드되기 전에 반환되고 모든 것이로드되기 전에 dispatch_group_notify가 호출됩니다.계속 진행하기 전에 dispatch_async를 기다리는 방법?
그래서 무한 루프를 도입하여 플래그가 설정 될 때까지 기다립니다. 이것이 최선의 방법입니까? 아래 코드를 참조하십시오.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();
for (...) {
dispatch_group_async(group, queue, ^{
__block BOOL dataLoaded = NO;
[thirdPartyCodeCallWithCompletion:^{
dataLoaded = YES;
}];
// prevent infinite loop
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)),
queue, ^{
dataLoaded = YES;
});
// infinite loop to wait until data is loaded
while (1) {
if (dataLoaded) break;
}
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//update UI
});
}
무한 루프가 최선의 방법 : 대신 dispatch_semaphore_t을 시도 결코; [비동기 적으로 전달 된 블록이 완료되기를 기다리는 방법은 무엇입니까?] (http://stackoverflow.com/questions/4326350/how-do-i-wait-for-an-asynchronously-dispatched-block-to-finish/)를 참조하십시오. 4326754 # 4326754) – jatoben
굉장한 @ 자토 벤, 감사합니다! – Boon