을 사용하여 [AFHTTPClient getPath:...]
완료 블록으로 복귀하는 것을 피하려고합니다.AFHTTPClient 성공 및 실패 블록 내의 CFRunLoopRunInMode()
NSLog(@"start");
__block BOOL someCondition = NO;
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://domain.com"]];
[client getPath:@"my/path" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"success");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"async log");
someCondition = YES;
});
while (!someCondition) {
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, YES);
}
NSLog(@"failure");
}];
그리고 출력이 될 것으로 예상 :
내 코드는 아래와 같다
start
async log
failure
하지만 그 대신 나는 단지 얻을 :
start
CFRunLoopRunInMode()
은 kCFRunLoopRunHandledSource
을 반환하지만 디스패치 큐는 제출 된 블록을 실행하지 않습니다. 완료 블록 외부에서 동일한 코드를 실행하면 예상대로 출력됩니다.
내가 알 수없는 이유는 완료 블록에서 실행될 때 디스패치 대기열이 처리되지 않는 이유입니다.
누군가 이러한 일이 발생하는 이유에 대해 조명 해 주실 수 있습니까?
* 완료 블록 *입니다. HTTP 요청 작업이 완료되면 첫 번째 블록이 호출되고 요청이 실패하면 두 번째 블록이 호출됩니다. - 일부 비동기 작업이 끝날 때까지 기다리려고 시도하는 것은 좋지 않은 생각입니다. 특히 주 스레드와 사용자 인터페이스를 차단하는 경우 특히 그렇습니다. –
나는 가장자리에서 살고 싶다;) 진지하게, 나는 그것이 왜 그렇게 행동 하는지를 정말로 알고 싶다. – hectr