2016-01-13 57 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. 
}]; 

希望這有助於!