IOS/Objective-c:从完成块或闭包异步返回值到调用函数



由于闭包或完成块的异步性质,我认为不可能直接从闭包或完成块中"返回"值。 但是,在我的UI中,对于聊天应用程序,这是可以接受的 - 实际上需要等待响应。因此,我的问题是,在获得响应之前保持任何活动的最佳方法是什么,其次,将响应返回到调用方法。

这就是我想做的,我认为你不能做到......

(NSString*) getStringFromRemoteResource {
[self goGetString:^(NSString *string,NSError *error){
NSLog(@"retrieved string is%@",string);
return string;//NOT ALLOWED
}];
}

另一方面,您可以在返回无效的情况下执行此操作

(void) getStringFromRemoteResource {
[self goGetString:^(NSString *string,NSError *error){
NSLog(@"string is%@",string);
[self doSomethingWithString];
}];
}

在我的代码中,调用上述方法的管理器必须返回一个值。

(NSString*) chatManager {
[self getStringFromRemoteResource];
//do other stuff
return string;
}

所以我的问题是在调用getStringFromRemoteResource之后,我如何将结果返回给manageChat以将其返回到UI。或者 doSomethingWithString 是什么样子的? 我不想从根本上改变chatManager,因为它也做了很多其他的事情。

提前感谢您的任何建议

在任何异步调用过程中,除非阻止该线程,否则层次结构中不能有任何直接返回值的方法,但您需要

-(void)chatManager:(void (^)(NSString*))completed {
[self getStringFromRemoteResource:^(NSString *str) {
completed(str);
}];
}
-(void)getStringFromRemoteResource:(void (^)(NSString*))comp{
[self goGetString:^(NSString *string,NSError *error){
comp(string);
}];
}

-(void)chatManager:(void (^)(NSString*))completed {
[self goGetString:^(NSString *string,NSError *error){
completed(string);
}];
}

这里chatManager只是一个包装器,用于组织原因,使您能够在任何地方访问它的方法,而不是在任何地方复制它们,但它必须具有这种结构

最新更新