Objective c 使用回调返回字符串

Objective c 使用回调返回字符串,objective-c,xcode5,Objective C,Xcode5,我整个下午都在学习这个 下面是一个示例:,我成功地设置了一个回调,以获取对我拥有的web服务的异步调用的结果 web服务获取一个密钥代码,应用程序将其转换并传回进行身份验证 使用下面的代码,如何将方法从void更改为可以调用以返回密码的NSString -(void) showPassCode{ getAuthCodeAndMakePassCodeCompleteBlock callback = ^(BOOL wasSuccessful, NSString *passCode) { if

我整个下午都在学习这个

下面是一个示例:,我成功地设置了一个回调,以获取对我拥有的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];
}
-(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);
    }
}

如果更改方法的返回值,则必须在作用域结束之前(在每个分支上)同步显示返回值。块是异步运行的(正如您所猜测的那样),因此如果您将它传递给另一个方法(可能)异步运行它(网络通信),它将永远不会同步向您提供有效字符串。在这种情况下,如果没有线程同步,理想的概念就无法工作,但是如果完成块可以有进一步的过程,为什么要使事情过于复杂呢?或者原始方法也可以有自己的完成块?