我希望函数在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 ;
}
答案 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调用,嵌套会变得非常烦人。这是一个很好的工具来解决这个问题。