升级到AFNetworking

时间:2013-10-22 13:36:41

标签: ios objective-c asihttprequest afnetworking-2 nsurlsession

我正在从开发人员手中接管一个旧的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将无法解决问题,对吗?

1 个答案:

答案 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]