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

时间:2018-09-22 12:17:48

标签: ios objective-c closures

由于闭包或完成块的异步性质,我认为不可能直接从一个值“返回”值。但是,在我的用户界面中,对于聊天应用程序来说,这是可以接受的,并且实际上有必要等待响应。因此,我的问题是,在得到响应之前,保持任何活动的最佳方法是什么,其次,将响应返回给调用方法。

这是我想做的事,我认为您无法做到...

(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,因为它也可以做很多其他事情。

提前感谢您的任何建议

1 个答案:

答案 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只是出于组织原因的包装,使您可以在任何地方访问它的方法,而不必在任何地方复制它们,但是它必须具有这种结构