0

我希望函数在完成之前不返回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 ;
}
4

3 回答 3

2

你的设计不正确。

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

于 2013-01-27T07:00:17.537 回答
1

由于 AFNetworking 是异步的,这是不可能的。使用异步请求时,您应该始终在成功/完成块中调用完成代码。

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

于 2013-01-27T06:59:58.550 回答
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 调用只是为了获得您想要测试的调用,那么嵌套可能会变得非常烦人。这是一个很好的工具来解决这个问题。

于 2013-02-19T06:43:52.110 回答