2013-04-27 6 views
8

완료 핸들러에서 값을 리턴 할 메소드를 호출하려고합니다. 이 메서드는 비동기 적으로 수행되며 메서드 본문이 모두 실행되기 전에 값을 반환하지 않습니다. 나는 NXOAuth2Request이 완료 될 때까지 getCurrentClient 방법은 값을 반환하지 않으려는완료 핸들러와 리턴 값

// This is the way I want to call the method 
NSDictionary *account = [_accountModel getCurrentClient]; 

// This is the faulty method that I want to fix 
- (NSDictionary *)getCurrentClient 
{ 
    __block NSDictionary *currentClient = nil; 
    NXOAuth2Account *currentAccount = [[[NXOAuth2AccountStore sharedStore] accounts] lastObject]; 

    [NXOAuth2Request performMethod:@"GET" 
         onResource:[NSURL URLWithString:[NSString stringWithFormat:@"%@/clients/%@", kCatapultHost, currentAccount.userData[@"account_name"]]] 
        usingParameters:nil 
         withAccount:currentAccount 
       sendProgressHandler:nil 
        responseHandler:^ (NSURLResponse *response, NSData *responseData, NSError *error) { 
         NSError *jsonError; 

         currentClient = [NSJSONSerialization JSONObjectWithData:responseData 
                     options:kNilOptions 
                      error:&jsonError]; 
        }]; 

    return currentClient; 
} 

: 저는 여기에 달성하기 위해 노력하고 무엇을 설명하기 위해 몇 가지 결함 코드입니다. 요청의 응답 핸들러 내에서 현재 클라이언트를 리턴 할 수 없습니다. 그렇다면 내 선택권은 무엇입니까?

답변

19

getCurrentClient을 변경해야 값을 반환하는 대신 완료 블록을 가져와야합니다. 예를 들어

:

-(void)getCurrentClientWithCompletionHandler:(void (^)(NSDictionary* currentClient))handler 
{ 
    NXOAuth2Account *currentAccount = [[[NXOAuth2AccountStore sharedStore] accounts] lastObject]; 

    [NXOAuth2Request performMethod:@"GET" 
         onResource:[NSURL URLWithString:[NSString stringWithFormat:@"%@/clients/%@", kCatapultHost, currentAccount.userData[@"account_name"]]] 
        usingParameters:nil 
         withAccount:currentAccount 
       sendProgressHandler:nil 
        responseHandler:^ (NSURLResponse *response, NSData *responseData, NSError *error) { 
         NSError *jsonError; 

         NSDictionary* deserializedDict = [NSJSONSerialization JSONObjectWithData:responseData 
                         options:kNilOptions 
                          error:&jsonError]; 
         handler(deserializedDict); 
       }]; 
} 

그것은 네트워크 요청이 다른 스레드에 전달되는 동안 getCurrentClient가 즉시 반환됩니다 것을 기억하는 것이 중요합니다. 응답 핸들러를 사용하여 UI를 업데이트하려면 핸들러가 run on the main thread이어야 함을 잊지 마십시오.

+0

'getCurrentClient'가 값을 반환하도록 할 수 있습니까? ** 그리고 ** 완료 핸들러가 있습니까? 반환 값은 다음과 같습니다. return handler (deserializedDict); –

+1

아니요. 실제 비동기 요청이 완료되기 전에'getCurrentClient'가 리턴합니다. getCurrentClient가 사용되는 반환 값 대신에 콜백을 사용하도록 구조를 업데이트해야합니다. – Tim

+0

정말 대단히 도움이되었습니다. 고마워, 팀. –