搞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库让你可以安全的使用具体详情可以去查看上面我给出的链接。
最后
本人水平有限如果哪里有地方写错或者写的不好,还望大家及时指出我会尽快修改,以免误导他人,如果上面哪个有更好的解决方法还望无私分享,大家沟通交流一起学习。