美文网首页iOS Framework
AFNetworking使用时遇到的那些问题

AFNetworking使用时遇到的那些问题

作者: RedQ | 来源:发表于2016-07-18 10:23 被阅读299次

    搞iOS开发应该都知道AFNetworking这个优雅的网络请求库,基本上我们搞app基本上要跟网络打交道,基本上我们也会用到AFNetworking这个网络库,如果你使用的是Swift语言开发的那你使用的也是同一个作者开发的另一个网络请求库Alamofire,AFNetwork 的前缀 AF 是 Alamofire 的缩写,因此这个新的库名称其实是根据 Swift 的约定来进行命名的。接下来我会把我在开发中使用AFN遇到的一些问题列出来。


    使用AFN遇到的那些问题

    1、处理返回数据时出现Error Domain=NSCocoaErrorDomain Code=3840 错误,报错:
    Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unescaped control character around character 2884.) UserInfo=0x79fa60b0 {NSDebugDescription=Unescaped control character around character 2884.}
    原因在于出现特殊字符是AFNetworking无法解析的,会直接报错,那么当你在发post请求时,返回结果会直接进如fail代码块,其实在fail中用operation的nsstring可以直接输出接收到的数据,是string形,可以清楚的看到服务器端数据有哪些含有特殊字符,但是有一些字符是不好看到的,比如“TAB”(制表)键打出的那种四个空格,项目中用户有时候很常用到tab键,最好的方法是在AFNetworking源码中添加字符过滤功能
    处理办法:找到AFNetworking包中AFURLResponseSerialization.m文件,大概在第256行的 if (responseString && ![responseStringisEqualToString:@" "])(此时已将data转化为responseString形)条件下面添加如下过滤方法:

    NSCharacterSet *controlChars = [NSCharacterSet controlCharacterSet];
         NSRange range = [responseString rangeOfCharacterFromSet:controlChars];
         if (range.location != NSNotFound)
            {
              NSMutableString *mutable = [NSMutableString stringWithString:responseString];
               while (range.location != NSNotFound)
                     {
                         [mutable deleteCharactersInRange:range];
                         range = [mutable rangeOfCharacterFromSet:controlChars];
                      }
                 responseString = mutable;
             } ```
    
    OK,再试一下,应该不会在报错了。
    参考网址[链接](http://blog.csdn.net/atomgirl/article/details/43154483)
    ****
    2、AFNetworking请求数据,我们会对AFN进行封装再使用或者直接使用,当我们使用时  
    
    
    • (NSMutableArray *)createRequestWithUrlString:(NSString *)string
      {
      _dataArr = [[NSMutableArray alloc]init];
      AFHTTPRequestOperationManager *manger = [AFHTTPRequestOperationManager manager];
      manger.responseSerializer = [AFHTTPResponseSerializer serializer];
      [manger GET:string parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject){
      if (operation.responseData)
      {
      NSDictionary *result = [NSJSONSerialization JSONObjectWithData:operation.responseData options:NSJSONReadingMutableContainers error:nil];
      NSArray *resultArr = [result objectForKey:@"news"];
      for (NSDictionary *dict in resultArr)
      {
      TopModel *model = [[TopModel alloc]init];
      [model assinWithDict:dict];
      [_dataArr addObject:model];
      }
      [self reloadData];
      }
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error = %@",error); }];
      return _dataArr;
      }```
      请求数据总是直接跳出来,返回的内容为空,我们应该做的是在解析下面加一个reloaData方法,这样返回的内容就不会为空了,FNetworking请求数据的时候直接return。无数据返回。因为是异步请求。主线程优先 return _dataArr; 放在Success里面试试 这样应该可以,异步请求会先return掉得,放在success里 就不一样了。当我们使用dispatch_group 成组操作的时候我们可以在dispatch_group_notify方法中刷新视图,这样就不会无数据显示。

    3、AFNetWorking 3.0在CocoaPods上的坑,当我们使用AFN的3.0的版本的时候,我们使用podfile的时候会出现问题,使用pod search 方法你会发现AFN在CocoaPods没有3.0版本,可能原因是AFN更新太快CocoaPods没有同步跟新过来,具体方法和原因我是参考这篇文章解决问题的链接


    4、使用AFN中的AFHTTPSessionManager对象调用请求GET方法后,一直没有被释放,因为它一直强引用着session即NSURLSession对象,而session一直被session的delegate强引用着,这样就造成了循环引用导致内存泄漏。当我对AFN封装使用,检测APP发现有内存泄漏问题,这个问题很早以前就有人在Github上提过了,@mattt当时也回复了这里.这个问题你也可以在stackoverflow搜索基本可以解决你的问题,我查看的网址是链接,作者还在最后给出了他封装的AFN3.0库让你可以安全的使用具体详情可以去查看上面我给出的链接。

    最后

    本人水平有限如果哪里有地方写错或者写的不好,还望大家及时指出我会尽快修改,以免误导他人,如果上面哪个有更好的解决方法还望无私分享,大家沟通交流一起学习。

    相关文章

      网友评论

        本文标题: AFNetworking使用时遇到的那些问题

        本文链接:https://www.haomeiwen.com/subject/pplpjttx.html