【发布时间】:2014-06-09 06:43:39
【问题描述】:
我整个下午都在研究/学习这个。
以下示例:http://themainthread.com/blog/2012/09/communicating-with-blocks-in-objective-c.html,我设法设置了一个回调来获取对我拥有的 Web 服务的异步调用的结果。
Web 服务获取密钥代码,应用程序对其进行转换并将其传回以进行身份验证。
使用下面的代码,如何将方法从 void 更改为可以调用以返回密码的 NSString?
-(void) showPassCode{
getAuthCodeAndMakePassCodeCompleteBlock callback = ^(BOOL wasSuccessful, NSString *passCode) {
if (wasSuccessful) {
NSLog(@"Code is: %@", passCode);
} else {
NSLog(@"Unable to fetch code. Try again.");
}
};
[self getAuthCodeAndMakePassCode:@"myAuthCode" withCallback:callback];
}
理想情况下,我希望它能够工作或看起来像这样:
-(NSString *) strPassCode{
getAuthCodeAndMakePassCodeCompleteBlock callback = ^(BOOL wasSuccessful, NSString *passCode) {
if (wasSuccessful) {
return passCode;
} else {
return nil;
}
};
[self getAuthCodeAndMakePassCode:@"myAuthCode" withCallback:callback];
}
【问题讨论】:
-
如果更改方法的返回值,则必须在作用域结束之前(在每个分支上)同步呈现返回值。该块异步运行(正如您已经猜到的那样),因此如果您将它传递给另一个方法(可能)将异步运行它(网络通信),它将永远不会同步向您提供有效的字符串。如果没有线程同步,你的理想概念在这种情况下是行不通的,但是如果完成块可以有进一步的过程,你为什么要把事情复杂化呢?还是原始方法也可以有自己的完成块?
标签: objective-c xcode5