由于闭包或完成块的异步性质,我认为不可能直接从一个值“返回”值。但是,在我的用户界面中,对于聊天应用程序来说,这是可以接受的,并且实际上有必要等待响应。因此,我的问题是,在得到响应之前,保持任何活动的最佳方法是什么,其次,将响应返回给调用方法。
这是我想做的事,我认为您无法做到...
(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,因为它也可以做很多其他事情。
提前感谢您的任何建议
答案 0 :(得分:1)
在任何异步调用过程中,除非阻塞该线程,否则层次结构中都不能有直接返回值的任何方法,但您需要
-(void)chatManager:(void (^)(NSString*))completed {
[self getStringFromRemoteResource:^(NSString *str) {
completed(str);
}];
}
-(void)getStringFromRemoteResource:(void (^)(NSString*))comp{
[self goGetString:^(NSString *string,NSError *error){
comp(string);
}];
}
OR
-(void)chatManager:(void (^)(NSString*))completed {
[self goGetString:^(NSString *string,NSError *error){
completed(string);
}];
}
这里chatManager
只是出于组织原因的包装,使您可以在任何地方访问它的方法,而不必在任何地方复制它们,但是它必须具有这种结构