从块内返回父方法

时间:2013-01-25 09:04:29

标签: ios objective-c cocoa

您好我在Objective-C中使用块

我认为我想要的是以下内容:

- (void) iNeedAToken {

  NSString *token = [self theMethodThatShouldReturnTheToken];

}

- (NSString) theMethodThatShouldReturnTheToken {

  [myAwesomeAsyncMethod success:^(id JSON) {

        NSString *token = [JSON objectForKey:@"FOO"];
        return token;

    }]

}

这可能吗?或者这是错误的逻辑吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

您将异步与同步代码混合在一起。在传递给theMethodThatShouldReturnTheToken的块完成之前,您已success已返回(您错过了返回值)。

最好的办法是从成功块继续你的过程。

- (void) tokenRequestContext1
{
    [self requestToken:^(NSString *token) {
        // do something with token
    }];
}

- (void) requestToken:(void(^)(NSString *))tokenBlock
{
    [myAwesomeAsyncMethod success:^(id JSON) {
        NSString *token = [JSON objectForKey:@"FOO"];
        if (tokenBlock) {
            tokenBlock(token);
        }
    }];
}

首先致电requestToken。这将启动令牌的异步请求。有些时间可能会过去,但最终会调用doSomethingWithToken,您可以使用收到的令牌。

答案 1 :(得分:-1)

答案 2 :(得分:-1)

此代码的常规版本为:

- (void) iNeedAToken {
  [self theMethodThatShouldReturnTheToken:^(id res){ token = res;}];
  NSString *token = [self theMethodThatShouldReturnTheToken];

}

- (void) theMethodThatShouldReturnTheToken:(void  (^)(id res)result) {

  [myAwesomeAsyncMethod success:^(id JSON) {

        NSString *token = [JSON objectForKey:@"FOO"];
        result(token);

    }]

}