我想要的功能不返回,直到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 ;
}
你的设计是不正确。
AFHTTPRequestOperation
是异步的,所以你不能(和你不应该)以同步的方式对待它。 您必须修改您的工作流程,以使用的完成或失败块AFHTTPRequestOperation
。
由于AFNetworking是异步的,这是不可能的。 当使用异步请求,你应该始终调用成功/瓶口垫块内的代码整理。
如果您解释一下,你正在使用的下载方法,以及为什么你需要知道它结束时我可以帮助解释/帮助你更好地设计它。
我将与其他上面同意通常你应该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调用只是为了得到你要测试的呼叫嵌套可能会变得非常烦人。 这是一个极好的工具来解决这一点。