如何让函数返回AFHTTPRequestOperation做了之后(how to make func

2019-07-18 18:36发布

我想要的功能不返回,直到AFHTTPRequestOperation完成,但我不知道如何做到这一点,在此先感谢。

-(BOOL)download
{
BOOL ret = TRUE;
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    ret = [self handle:data];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Failure: %@", error);
}];
[operation start];
return ret ;
}

Answer 1:

你的设计是不正确。

AFHTTPRequestOperation是异步的,所以你不能(和你不应该)以同步的方式对待它。 您必须修改您的工作流程,以使用的完成或失败块AFHTTPRequestOperation



Answer 2:

由于AFNetworking是异步的,这是不可能的。 当使用异步请求,你应该始终调用成功/瓶口垫块内的代码整理。

如果您解释一下,你正在使用的下载方法,以及为什么你需要知道它结束时我可以帮助解释/帮助你更好地设计它。



Answer 3:

我将与其他上面同意通常你应该AFNetworking异步特性坚守,但有办法使伪同步代码为AFNetworking请求运行。

使用您的示例下面的代码应该工作。

-(BOOL)download {
    BOOL ret = TRUE;
    __block BOOL complete = NO;
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        ret = [self handle:data];
        complete = YES;
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Failure: %@", error);
        complete = YES;
    }];
    [operation start];

    while(complete == NO) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
    }

    return ret;
}

我发现这种用法是与单元测试的API特别有用。 如果你要做的API调用只是为了得到你要测试的呼叫嵌套可能会变得非常烦人。 这是一个极好的工具来解决这一点。



文章来源: how to make function to return after the AFHTTPRequestOperation has done