1

我正在从不再属于该项目的开发人员手中接手一个旧的 iOS 项目 - 该应用程序正在被重写,因此我将仅支持 iOS7 及更高版本。

所以,我想使用 AFNetworking 2.0 而不是 ASIHTTPRequest——这背后的原因是 NSURLSeesion。AFNetworking 2.0 支持 NSURLSession 并且我可以让我的应用程序在机会时在后台下载内容(根据 Apple - 必须使用 NSURLSession 并打开后台获取模式,才能工作?)

首先让我说我是 iOS 的新开发人员,网络方面的东西让我有点不知所措 - 但我决心尽可能多地了解它。我也阅读了 AFNetworking 文档,但我担心因为某些术语(请求、响应、灭菌等)我无法理解——我并没有 100% 掌握它们。

因此,我查看了以前的开发人员用来构建 GET / POST 请求的 ASIHTTPRequest 代码 - 这是他们使用的代码:

 + (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 不会成功,对吗?

4

1 回答 1

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;
}

它适用于我需要它做的事情 - 但我不确定这是否是最好的方法。

我看不到如何通过查看 NSString 值来检测 requestType 。我查看了 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;

除非我完全错了。之后我决定只检查requestType使用[NSString isEqualToString]

于 2013-10-29T13:58:25.280 回答