Objective c 使用回调返回字符串
我整个下午都在学习这个 下面是一个示例:,我成功地设置了一个回调,以获取对我拥有的web服务的异步调用的结果 web服务获取一个密钥代码,应用程序将其转换并传回进行身份验证 使用下面的代码,如何将方法从void更改为可以调用以返回密码的NSStringObjective c 使用回调返回字符串,objective-c,xcode5,Objective C,Xcode5,我整个下午都在学习这个 下面是一个示例:,我成功地设置了一个回调,以获取对我拥有的web服务的异步调用的结果 web服务获取一个密钥代码,应用程序将其转换并传回进行身份验证 使用下面的代码,如何将方法从void更改为可以调用以返回密码的NSString -(void) showPassCode{ getAuthCodeAndMakePassCodeCompleteBlock callback = ^(BOOL wasSuccessful, NSString *passCode) { if
-(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];
}
-(void)getAuthCodeWithCallback:(void (^)(NSString* authCode))callback
{
//make server call, asynchronously in this example
[self someMethodCallToQueryCodeFromServerWithCallback:^(NSError* error, NSString* code) {
if (error) {
//handle error
}
else
callback(code);
}
}
在不知道代码的细节以及如何查询服务器的情况下,我不得不想象它会是这样的:
-(void)getAuthCodeWithCallback:(void (^)(NSString* authCode))callback
{
//make server call, synchronously in this example
NSString* codeReturnedFromServer = [self getServerCodeSynchronous];
callback(codeReturnedFromServer);
}
//some calling code
[self getAuthCodeWithCallback:^(NSString* authCode) {
NSLog(@"Code is: %@", authCode);
}];
如果从服务器获取身份验证代码的方法是异步的,则它将如下所示:
-(NSString *) strPassCode{
getAuthCodeAndMakePassCodeCompleteBlock callback = ^(BOOL wasSuccessful, NSString *passCode) {
if (wasSuccessful) {
return passCode;
} else {
return nil;
}
};
[self getAuthCodeAndMakePassCode:@"myAuthCode" withCallback:callback];
}
-(void)getAuthCodeWithCallback:(void (^)(NSString* authCode))callback
{
//make server call, asynchronously in this example
[self someMethodCallToQueryCodeFromServerWithCallback:^(NSError* error, NSString* code) {
if (error) {
//handle error
}
else
callback(code);
}
}
如果更改方法的返回值,则必须在作用域结束之前(在每个分支上)同步显示返回值。块是异步运行的(正如您所猜测的那样),因此如果您将它传递给另一个方法(可能)异步运行它(网络通信),它将永远不会同步向您提供有效字符串。在这种情况下,如果没有线程同步,理想的概念就无法工作,但是如果完成块可以有进一步的过程,为什么要使事情过于复杂呢?或者原始方法也可以有自己的完成块?