代码之家  ›  专栏  ›  技术社区  ›  user6631314

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

  •  0
  • user6631314  · 技术社区  · 6 年前

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

    (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;
            }
    

    提前谢谢你的建议

    1 回复  |  直到 6 年前
        1
  •  1
  •   Shehata Gamal    6 年前

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

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

    推荐文章