0

嗨,我是在 Objective-C 中使用块的新手

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

- (void) iNeedAToken {

  NSString *token = [self theMethodThatShouldReturnTheToken];

}

- (NSString) theMethodThatShouldReturnTheToken {

  [myAwesomeAsyncMethod success:^(id JSON) {

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

    }]

}

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

谢谢!

4

3 回答 3

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会在您可以使用收到的令牌的地方调用。

于 2013-01-25T09:09:45.913 回答
-1

有一种等待完成块完成的方法的描述:http: //omegadelta.net/2011/05/10/how-to-wait-for-ios-methods-with-completion-blocks-to-finish /

于 2013-01-25T09:08:47.430 回答
-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);

    }]

}
于 2013-01-25T09:11:37.293 回答