완료 핸들러를 이해하려고 시도 중임 & 블록. 완성 처리기가없는 많은 프로그래밍 프로그래밍 블록을 사용할 수 있다고 생각하지만 완성 처리기는 블록을 기반으로한다는 것을 알고 있습니다. (따라서 기본적으로 완료 핸들러는 블록이 필요하지만 다른 방법은 필요하지 않습니다.) iOS에서 완료 핸들러는 어떻게 작동합니까?
그래서 예전의 트위터 프레임 워크에 대해 인터넷에서이 코드를 보았다 : 여기[twitterFeed performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
if (!error) {
self.successLabel.text = @"Tweeted Successfully";
[self playTweetSound];
} else {
// Show alert
}
// Stop indicator
sharedApplication.networkActivityIndicatorVisible = NO;
}];
우리가 드 responseData & urlResponse & 오류가 완료되면 물건 (TWRequest을 수행) 반환을하는 방법을 요구하고있다. 리턴 할 때만 테스트가 허용 된 블록을 실행하고 활동 표시기를 중지합니다. 완전한!
지금이 내가 일하는 다른 앱이 셋업,하지만 난 함께 조각을 넣어려고 :
- fetchUsersWithCompletionHandler 분명하다 : 여기
내 이해입니다 performRequestWithHandler의 동급어@interface Define an ivar typedef void (^Handler)(NSArray *users); Declare the method +(void)fetchUsersWithCompletionHandler:(Handler)handler; @implementation +(void)fetchUsersWithCompletionHandler:(Handler)handler { //...Code to create NSURLRequest omitted... __block NSArray *usersArray = [[NSArray alloc] init]; //A. Executes the request dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // Peform the request NSURLResponse *response; NSError *error = nil; NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // Deal with your error if (error) { } NSLog(@"Error %@", error); return; } // Else deal with data NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; usersArray = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSASCIIStringEncoding] options:0 error:nil]; // Checks for handler & returns usersArray to main thread - but where does handler come from & how does it know to wait tip usersArray is populated? if (handler){ dispatch_sync(dispatch_get_main_queue(), ^{ handler(usersArray); }); } }); }
- 도중에 GCD 호출이 있기 때문에 불행히도 이것은 다소 복잡합니다 ...
기본적으로 요청이 실행되고 오류가 처리되고 데이터가 처리 된 다음 처리기가 검사됩니다. 내 질문은이 처리기가 어떻게 작동하는가? 나는 그것이 메인 큐로 돌아가서 usersArray를 돌려 보낼 것이 존재하는지 이해한다. 그러나 usersArray가 채워질 때까지 기다리는 것을 어떻게 알 수 있습니까? 내가 뭘 혼란스럽게 생각하는 그 방법은 :이 경우에는 블록 안에 다른 블록, dispatch_async 호출이있다. 내가 찾고있는 것은 실제로 물건을 만들고 응답 데이터와 urlResponse를 반환 할 때를 알고있는 로직이다. 나는 그것의 동일한 애플 리케이션을 안다,하지만 나는 performRequestWithHandler에 대한 코드를 볼 수 없다.
2 질문 : (1) 왜 3 단계에서 "백그라운드 대기열에 몇 가지 무료 리소스가있을 때까지 시간이 지났습니다." 왜 무료 자원이 없습니까? 메인 대기열과 7/8 단계에서도 동일합니다. 왜 무료 리소스가 없으므로 기다려야합니까? 그리고 가장 중요한 것은 어떻게 처리기가 usersArray를 다시 처리하도록 "처리"합니까? 코드의 어떤 부분이 처리기에게 누가 데이터를 보낸 사람에게 데이터를 보내도록 지시합니까? – marciokoko
수정 된 답변보기 – deekay
NSData를 NSString으로 변환 한 다음 NSData로 다시 변환 할 필요가 있습니까? – Rishab