使用回调返回字符串

Posted

技术标签:

【中文标题】使用回调返回字符串【英文标题】:Use callback to return string 【发布时间】: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];

【问题讨论】:

如果更改方法的返回值,则必须在作用域结束之前(在每个分支上)同步呈现返回值。该块异步运行(正如您已经猜到的那样),因此如果您将它传递给另一个方法(可能)将异步运行它(网络通信),它将永远不会同步向您提供有效的字符串。如果没有线程同步,你的理想概念在这种情况下是行不通的,但是如果完成块可以有进一步的过程,你为什么要把事情复杂化呢?还是原始方法也可以有自己的完成块? 【参考方案1】:

在不知道你的代码细节以及你如何查询服务器的情况下,我不得不想象它看起来像:

-(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);
];

如果从服务器获取验证码的方法是异步的,它看起来像这样:

-(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);
    

【讨论】:

以上是关于使用回调返回字符串的主要内容,如果未能解决你的问题,请参考以下文章

从回调中返回字符串 - Java

Asp.Net MVC 的ContentResult 返回字符串,jquery.post的回调函数不接受,为啥?

我们如何将字符串从回调函数返回到 node.js 中的根函数?

WebMethod 返回 JSON 但我的 $.ajax() 回调中的响应 obj 只是一个字符串

Google Adword 脚本中止并出现以下错误:传递给回调函数的返回值必须是字符串

axios如何进行跨域以及对返回格式为回调函数字符串的处理