2016-01-13 58 views
0

我的目标C下面的方法:如何在主线程中像回调一样返回变量?

- (BOOL) authorize { 

    OauthObject* oauthObj = [OauthObject sharedManager]; 

    [[Manager sharedManagerServerRequest] authorize:(oauthObj) and:login.text withPassword:password.text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     NSLog(@"%@", error); 

     if(error == NULL && data != nil) { 
      self.requestSuccessfull = YES; 

     } else { 
      //NSLog(@"Error: %@", error); 
      // Display error 
     } 
    }]; 

    return self.requestSuccessfull; 
} 

在这个函数有方法authorize,它请求服务器返回数据以块。

问题是- (BOOL) authorize返回的速度更快return self.requestSuccessfull并且它始终为FALSE。

+0

你错过了关于块的异步开发的一些基础知识。你不能派遣队列返回,它有它自己的范围。 @Abamazi – Jaimish

回答

2

该请求是异步的,因此您应该使用阻止回拨。您可以更改代码:

- (void)authorize:(void (^)(BOOL result))completionHanlder { 
    OauthObject* oauthObj = [OauthObject sharedManager]; 

    [[Manager sharedManagerServerRequest] authorize:(oauthObj) and:login.text withPassword:password.text completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     NSLog(@"%@", error); 

     if(error == NULL && data != nil) { 
      completionHanlder(YES); 

     } else { 
      completionHanlder(NO); 
      //NSLog(@"Error: %@", error); 
      // Display error 
     } 
    }]; 
} 

你也可以使用这样的:

[yourInstance authorize:^(BOOL result) { 
    //user result here. 
}]; 

希望这有助于!