我正在从开发人员手中接管一个旧的iOS项目,不再是项目的一部分 - 应用程序正在重写,我将支持iOS7及以上版本。
所以,我想使用AFNetworking 2.0而不是ASIHTTPRequest - 其背后的原因是NSURLSeesion。 AFNetworking 2.0支持NSURLSession,我可以让我的应用程序在机会时间在后台下载内容(根据Apple - 必须使用NSURLSession并启用后台获取模式,这样才能工作?)
首先我要说的是,我是iOS的新开发者,网络方面的东西有点过头了 - 但我决心要尽可能多地了解它。我也阅读了AFNetworking文档,但我担心,因为一些术语让我感到厌烦(请求,响应,消毒等) - 我不是100%地抓住它们。
所以,我看了一下之前的开发人员以前的ASIHTTPRequest代码,从我看到的,构建一个GET / POST请求 - 这是他们使用的代码:
+ (ASIHTTPRequest*) buildRequest: (NSString*) url RequestType: (NSString*) requestType
PostData: (NSString*) postData
Host: (NSString*) host
ContentType: (NSString*) contentType
SoapAction: (NSString*) soapAction
RequestProperties: (NSDictionary*) requestProperties
{
NSURL *url = [NSURL URLWithString: url];
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:u] autorelease];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[request setTimeOutSeconds:20];
[request setQueuePriority:NSOperationQueuePriorityVeryHigh];
if (host != nil)
[request addRequestHeader: @"Host" value: host];
if (contentType != nil)
[request addRequestHeader: @"Content-Type" value: contentType];
if (soapAction != nil)
[request addRequestHeader: @"SOAPAction" value:soapAction];
if (requestType != nil)
[request setRequestMethod: requestType];
if (postData != nil)
{
NSMutableData* mPostData = [NSMutableData dataWithData:[postData dataUsingEncoding:NSUTF8StringEncoding]];
NSString *msgLength = [NSString stringWithFormat:@"%d", [postData length]];
[request setPostBody: mPostData];
[request addRequestHeader: @"Content-Length" value:msgLength];
}
if (requestProperties != nil)
{
for (int i = 0; i < [[requestProperties allKeys] count]; i++)
{
[request addRequestHeader:[[requestProperties allKeys] objectAtIndex: i] value: [requestProperties objectForKey:[[requestProperties allKeys] objectAtIndex: i]]];
}
}
return request;
}
我正在尝试理解此代码并将其升级为使用AFNetworking V2.0。我假设,用AFHTTPRequestOperation替换ASIHTTPRequest将无法解决问题,对吗?
答案 0 :(得分:0)
我得到了一些帮助,并设法做了很多挖掘,看看我是如何做到这一点的。
我使方法更简单 - 因为我不需要Soap / Content-type等 - 只需urlParamerters和一些基本的东西:
这是我提出的答案:
+ (AFHTTPSessionManager *) buildRequest: (NSString*) url RequestType: (NSString*) requestType PostDataValuesAndKeys: (NSDictionary*) postData RequestProperties: (NSDictionary*) requestProperties
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
if ([requestType isEqualToString:@"GET"])
{
[manager GET:url parameters:postData success:^(NSURLSessionDataTask *dataTask, id responseObject){
//Success
NSLog (@"Success");
NSData *xmlData = responseObject;
NSLog(@"Got XML Data: %@", xmlData);
}
failure:^(NSURLSessionDataTask *dataTask, NSError *error){
//Failure
NSLog (@"Failure");
}];
}else if ([requestType isEqualToString:@"GT"]){
[manager POST:url parameters:postData success:^(NSURLSessionDataTask *dataTask, id responseObject){
//Success
}
failure:^(NSURLSessionDataTask *dataTask, NSError *error){
//Failure
NSLog (@"Failure");
}];
}
return manager;
}
它可以用于我需要做的事情 - 但我不确定这是否是最好的方法。
我无法看到我如何检测requestType其他感谢查看NSString值。我查看了AFHTTPSessionManager.h文件以获取有关如何处理的一些线索 - 如果我希望它们以不同的方式完成,Matt建议覆盖GET / POST方法 - 根据他在头文件中的注释:
覆盖的方法
更改所有数据任务操作构造的行为 也用于
GET
/POST
/等。便利方法, 覆盖dataTaskWithRequest:completionHandler:
。
此文件中还有一个requestSerializer
属性 - 您可以使用它来检测请求的类型 - 但是它的实现将转到超类:AFURLSessionManager
在该课程中 - 有requestWithMethod
方法。
所以,我尝试这样做:
如果我尝试实现该方法 - 那么我没有在AFHTTPSessionManager中使用convince方法:
(NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(NSDictionary *)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure;
除非我完全错了。之后,我决定只使用requestType
[NSString isEqualToString]