gpt4 book ai didi

IOS/objective-c : Return value from completion block or closure asynchronously to calling function

转载 作者:行者123 更新时间:2023-11-28 23:47:20 25 4
gpt4 key购买 nike

由于闭包或完成 block 的异步性质,我认为不可能直接从一个值“返回”一个值。然而,在我的用户界面中,对于聊天应用程序来说,这是可以接受的——而且实际上有必要等待响应。因此,我的问题是,在收到响应之前暂停任何事件的最佳方法是什么,然后将响应返回给调用方法。

这是我想做的事,但我认为你做不到......

(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 只是出于组织原因的包装器,使您能够在任何地方访问它的方法,而不是在任何地方重复它们,但它必须具有此结构

关于IOS/objective-c : Return value from completion block or closure asynchronously to calling function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52456587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com