3

AFHTTPSessionManager GET : 디스패치 그룹 대기시 블록을 수행하지 않습니다. dispatch_group_wait는 실제로 "FOREVER"를 기다립니다. 내 코드에서 @ "모두 완료"결코 발생하지 않습니다.AFNetworking 3.1.0 및 디스패치 그룹

어떻게 작동합니까?

(미안하지만 대부분의 사람들은 여기에 디스패치 그룹을 사용하는 이유를 알고 싶어합니다. 그 이유는 루프에서 요청을 수행하고 마지막 응답을 기다리는 것입니다. 의도적으로 코드에 루프를 표시하지 않았습니다. , 루프가 수행되지 않는 블록에 영향을 미치지 않기 때문에)

dispatch_group_t group = dispatch_group_create(); 

NSString *urlString = @"someURLForExampleReturnJSON"; 
dispatch_group_enter(group); 
[self.sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) 
{ 
    NSLog(@"success block execution"); 
    dispatch_group_leave(group); 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"failure block execution"); 
    dispatch_group_leave(group); 
}]; 

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
NSLog(@"all done"); 
+0

흠, 당신은 아마 대신 – Fonix

+0

을 dispatch_semaphore을 사용해야 여기 dispatch_group''의 사용이 무엇인지 이해할 수 없습니다입니다 ? 여기서 필요한 것을 설명해 주시겠습니까? 왜 당신은'dispatch_group'을 사용합니까? 미안하지만 dispatch_group_notify – CodeChanger

+0

이 좋습니다. dispatch_groups를 사용하는 이유를 설명해야했습니다. – Andrea

답변

1

첫 번째 : 기다리지 않고 메인 스레드를 차단하고 싶지 않습니다.

실제 문제점 : 교착 상태가 발생합니다. 당신은 group.notify를 사용할 수 있습니다

의 Obj-C :

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    NSLog(@"all done"); 
}); 

스위프트 3 :

group.notify(queue: DispatchQueue.main, execute: { 
    print("all Done") 
}) 

이 이해가되지 않습니다하지만, 당신이, 발송 그룹없이 같은 결과를 보관할 수있는 I 적극 추천 :

[self.sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
    NSLog(@"all done"); 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"failure block execution"); 
}]; 

기다리고 싶다면 다음을 사용하십시오. ACH :이이 dispatch_group가 (특히이 같은)를위한 것입니다 무엇을 생각 해달라고

import Foundation 

print("main start") 

let group = DispatchGroup() 
group.enter() 
// put your heavy task on background queue 
DispatchQueue.global(qos: .background).async { 
    print("background start") 
    sleep(2) // do some long running task 
    print("background stop") 
    group.leave() 
} 

// wait on main queue 
group.wait() 
print("go on") 
+0

을 사용하면 –