我正在从不再属于该项目的开发人员那里接管一个旧的iOS项目 - 该应用程序正在重写,因此我将仅支持iOS7及更高版本。
所以,我想使用AFNetworking 2.0而不是ASIHTTPRequest - 这背后的原因是NSURLSeesion。AFNetwork 2.0支持NSURLSession,有了它,我可以让我的应用程序在机会主义时间在后台下载内容(根据苹果公司 - 必须使用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。我认为,仅仅用AFHTTPRequest操作替换ASIHTTPRequest不会解决问题,对吗?
我得到了一些帮助,也设法做了很多挖掘,看看我如何才能做到这一点。
我使方法更简单 - 因为我不需要肥皂/内容类型等 - 只需要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;
}
它将适用于我需要它做的事情 - 但我不确定这是否是最好的方法。
我看不出如何通过查看 NSString 值来检测请求类型其他感谢。我查看了AFHTTPSessionManager.h文件,以获取有关如何处理它的一些线索 - Matt建议覆盖GET/POST方法,如果我希望它们以不同的方式完成 - 根据他在头文件中的评论:
重写方法
更改所有数据任务操作构造的行为,这 也用于
GET
/POST
/等人的便利方法, 覆盖dataTaskWithRequest:completionHandler:
。
该文件中还有一个 requestSerializer
属性 - 您可以使用它来检测请求的类型 - 但是它的实现转到超类:AFURLSessionManager
在该类中 - 有一个requestWithMethod
方法。
所以,我试着这样做:
如果我尝试实现该方法 - 那么我没有使用 AFHTTPSessionManager 中的说服方法:
(NSURLSessionDataTask *)GET:(NSString *)URLString
parameters:(NSDictionary *)parameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure;
除非我完全错了。之后,我决定只使用[NSString isEqualToString]
检查requestType