如何在主线程中像回调一样返回变量?
问题描述:
我的目标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。
答
该请求是异步的,因此您应该使用阻止回拨。您可以更改代码:
- (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.
}];
希望这有助于!
你错过了关于块的异步开发的一些基础知识。你不能派遣队列返回,它有它自己的范围。 @Abamazi – Jaimish