如何在AFHTTPRequestOperation完成后使函数返回

时间:2013-01-27 06:54:50

标签: ios afnetworking

我希望函数在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 ;
}

3 个答案:

答案 0 :(得分:2)

您的设计不正确。

AFHTTPRequestOperation是异步的,因此您不能(并且您不应该)以同步方式处理它。您必须修改工作流程才能使用AFHTTPRequestOperation

的完成或失败块

答案 1 :(得分:1)

由于AFNetworking是异步的,因此无法实现。使用异步请求时,应始终在成功/完成块中调用完成代码。

如果您解释使用下载方法的位置以及为什么需要知道它何时完成,我可以帮助解释/帮助您更好地设计它。

答案 2 :(得分:0)

我同意上面的其他内容,通常你应该坚持使用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调用,嵌套会变得非常烦人。这是一个很好的工具来解决这个问题。