您好我在Objective-C中使用块
我认为我想要的是以下内容:
- (void) iNeedAToken {
NSString *token = [self theMethodThatShouldReturnTheToken];
}
- (NSString) theMethodThatShouldReturnTheToken {
[myAwesomeAsyncMethod success:^(id JSON) {
NSString *token = [JSON objectForKey:@"FOO"];
return token;
}]
}
这可能吗?或者这是错误的逻辑吗?
谢谢!
答案 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)
有一个等待完成块完成的方式的描述:http://omegadelta.net/2011/05/10/how-to-wait-for-ios-methods-with-completion-blocks-to-finish/
答案 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);
}]
}