Upgrading to AFNetworking



我正在从不再属于该项目的开发人员那里接管一个旧的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

最新更新