我正在为我使用 ASIHTTPRequest 的旧应用程序进行更新。由于客户想要升级这个应用程序,我选择将我现有的项目转换为正在处理内存管理的“ ARC ”项目由应用程序本身。
由于ASIHTTPRequest在执行多个请求时出现了一些错误(以及 ASI 已过时的事实),我选择使用一个名为AFNetworking的新库。在将此当前项目设置转换为 AFNetworking 时,我遇到了问题。
在我当前的设置中,我对给定服务器执行了如下请求:
_request = [[ASIHTTPRequest alloc ] initWithURL:[NSURL URLWithString:url]];
[_request setShouldContinueWhenAppEntersBackground:NO];
[_request setDidFinishSelector:@selector(downloadPageHasFinished:)];
[_request setDidFailSelector:@selector(downloadPageHasFailed:)];
[_request setDelegate:self];
[_request startAsynchronous];
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES];
在上面的设置中,我一直在使用两个选择器(didFinish 和 didFailed),我可以在其中捕获我的(非)成功请求。在该选择器中,我将我的 responseData 传回给给定的父级。
[parent downloadCompleted:YES andContent:responseData];
现在我已经切换到 AFNetworking,我也想在其中执行请求并将 responseData 传回给给定的父级。由于 AFNetworking 使用块,我不确定何时或如何传回此 responseData。由于 web 服务返回 XML,我选择添加 KissXML 标头链接,它是 AFHTTPRequestOperation 的子类。现在我可以在我的块语句中检索我的完整 XML 文档(我想要的)。但我不知道如何将此数据返回到我的特定视图控制器(并且我可以同时执行多个请求)。我目前对 AFNetworking 的设置如下。
-(NSData *)doAFNetworkRequest:(NSURL *)url {
__block NSData * datathingy = nil;
AFKissXMLRequestOperation *operation = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:[NSURLRequest requestWithURL:url] success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument) {
NSLog(@"THE COMPLETE DOCUMENT: %@", XMLDocument);
datathingy = [[XMLDocument description] dataUsingEncoding:NSUTF8StringEncoding];
//the place where I can't return values
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {
}];
[operation start];
return datathingy;
}
当我放置“return datathingy”时;在成功块部分我收到错误:
“不兼容的块指针类型发送 'NSData *(^)(NSURLRequest * _strong, NSHTTPURLResponse * _strong, DDXMLDocument *_strong )' 到类型参数 'void (^)(NSURLRequest * _strong, NSHTTPURLResponse *_strong , DDXMLDocument * _strong )'"
那么我如何能够在我的块中返回该 NSData 对象,以便请求的视图控制器将接收正确的 responseData 并且不会收到 nil 值?
注意 1:我想将完整的 XML 文档传回给我的视图控制器,因为解析是在每个特定的视图控制器中处理的。所以只有将 responseData 传递给父 Viewcontroller 才应该这样做。
注意2:我已经找到了一个可以将 ASI 直接转换为 AF 的资源,但我不确定 AFNetworking 的这些附加标头是否支持我以前对 ASI 的所有需求(即缓存和/或 ASIHTTPRequest 的附加属性)。