2014-06-09 1 views
0

나는이 작업을 힘들게하고 있지만 꽤 간단하다고 생각합니다. 기본적으로, 나는 webservice와 대화하는이 메서드를 가지고 있으며, 하위 메서드 인 "authCode"에서 일부 데이터를 반환해야합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 관리자에서 authCode를 가져 오려면 어떻게해야합니까? 아니면 관리자 블록이 먼저 실행되도록 블록이나 다른 것을 만들 수 있습니까? 나는 적당한 단어 - 블록, 서브 메소드를 사용하고 있는가? 제발 도와주세요 :)하위 메서드를 실행 한 후 속성에 액세스하는 방법?

- (NSString *)getAuthCodeEXAMPLE { 
__block NSString *returnString = @"nothing yet!"; 
NSURL *baseURL = [NSURL URLWithString:BaseURLString]; 
NSDictionary *parametersGetAuthCode = @{@"req": @"getauth"}; 

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL]; 
manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

[manager POST:APIscript parameters:parametersGetAuthCode success:^(NSURLSessionDataTask *task, id responseObject) { 
    if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) { 
     NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response; 
     if ([r statusCode] == 200) { 
      self.returnedData = responseObject; 
      NSString *authCode = [self.returnedData authcode]; 
      NSLog(@"Authcode: %@", authCode); 
      returnString = authCode; 
     } 
    } 
} failure:^(NSURLSessionDataTask *task, NSError *error) { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    [alertView show]; 
}]; 

//this currently returns "nothing yet!" 
return returnString; 

}

답변

0

가 비동기 방법은 평소처럼 물건을 반환 할 수 없습니다. 비동기 호출이 완료되기 전에 메소드의 끝에 도달합니다. 문자열을 다시 가져 오려면 콜백 블록을 사용해야합니다. success 블록에서 콜백 블록을 실행하여 문자열을 전달합니다. 콜백 블록을 메소드에 전달하여 (void)getAuthCodeWithCallback:(CallbackBlock)callback과 같은 이름으로 바꿔야합니다.

다음은 시작하기위한 콜백 블록 typedef입니다. typedef void(^CallbackBlock)(id object);

+0

감사합니다. 미래의 초보자를 위해 http://themainthread.com/blog/2012/09/communicating-with-blocks-in-objective-c.html에서 예를 따랐습니다. – Warren

관련 문제