美文网首页iOS高质量博客networknetwork
iOS AFNetworking使用技巧与问题(持续更新)

iOS AFNetworking使用技巧与问题(持续更新)

作者: 汉斯哈哈哈 | 来源:发表于2015-12-10 23:28 被阅读10880次
    • 1.很多初学者,在每处用到网络请求的地方会直接�拿afn实例去请求�,从而带来了后续难以维护代码的问题
        [[AFHTTPSessionManager manager] POST:nil parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
            
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            
        }];
    

    思考:如果afn不更新了,后续出现重大�bug适配问题,从而导致每处�用到afn的地方都要修改,请问怎么办?
    答案:呵呵,只能一个个修改了!有人会说,怎么可能不更新,很多人用着呢,怕什么。那假设其他第三方也同样出现类型的问题呢?所以是不是应该有方法或某种思想去解决呢?

    解决方法:写个网络基类HRHttpBase,提供两个方法:GET 与 POST,外面请求时,直接调用这两个方法,万一afn出了问题,只要修改这两个方法即可,从而减轻后续维护成本!这种做法�同样适用于其他的第三方库, 这也是一种开发思想。

    HRHttpBase.h

    HRHttpBase.m

    假设业务复杂的话,如登录,涉及到第三方登录之类的,有比较多的网络请求,可以专门抽一个网络请求类要处理:

    HRhttpLogin.h

    HRhttpLogin.m

    • 2.�用到CocoaPods,但更改了afn代码问题

    这是缺少text/html解析格式,请求网络时,只要添加上就行了,很多人在网上找到设置的地方(如下图)。但他忘了,项目用CocoaPods管理第三方库的,如果项目上线之前,同事更新了CocoaPods那么之前写的代码就没了!

    解决办法:通过AFHTTPSessionManager实例找到AFHTTPResponseSerializer 对象,然后看有没提供对应的方法或属性可设置该格式。

    像类似的网络请求headeruser-agent都应该在自己的代码里设置!

    • 3.返回字符串而并非是json或xml格式,怎么解析?

    开发中确实是存在�奇葩的需求,还有可能返回一堆html格式的String,要截取Sting里的某个key。对于处理不了的格式,afn有可能error回调。

    用AFHTTPSessionManager,我没找到未解析的字符(知道的朋友可以告诉我,谢谢)。最后还是用了AFHTTPRequestOperationManager

    operation.responseString即为未格式化的字符

    Paste_Image.png

    ps:如果朋友们还有些奇怪的问题,可以回复我,一起解决!

    文章同步到微信公众号:hans_iOS 有疑问可以在公众号里询问!

    相关文章

      网友评论

      • a08448b0e29f:版本更新获取的是html,怎么修改默认解析变成html获取版本信息?
      • hhgvg:为什么请求接口不走成功或者失败的方法 难道是后台的问题?
        汉斯哈哈哈:直接用charles抓包一目了然,哈哈
      • 丶我很抱歉:求帮助。 AFNetWorking 在断网的情况下请求,没有给出请求失败的提示,或者超时也就是说不会回调 failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        }
      • 叫我栓子:我想问下在AFNetworking更新到3.0.x的时候,发现 AFJSONRequestOperation 被弃用了,那我在更新这一块的时候用什么方法更新过来啊?或者是应该用哪个类替换它呢?
        汉斯哈哈哈:@叫我栓子 AFHTTPSessionManager
      • 花开半夏已成殇:请问下那个添加text/html要写在什么方法里面呀,求指教
        汉斯哈哈哈:@花开半夏已成殇 上面有了
      • 1bd90c3a5fe8:请教一下,我昨天用CocoaPods把AFN更新到了最新版本,但是做完迁移之后,从后台请求下来的数据全是16进制的数字,没办法解析,如下:
        7b226461 7461223a 7b226964 223a2238 61656633 38383235 32383233 34346130 31353530 37353365 61333435 66363922 2c226e61 6d65223a 22544a5f 46575f5a 5943222c 226f7267 4e616d65 223a22b9 facdf8cc ecbdf2b5 e7b6afc6 fbb3b5b7 fecef1b9 abcbbe22 2c22746f 74616c55 6e69636f 6465223a 22313231 30313132 34323622 2c22756e 69636f64 65223a22 31323432 36222c22 75736572 4e616d65 223a22d5 d4d3adb4 ba227d2c 226d6573 73616765 223a22b3 c9b9a622 2c227265 73756c74 223a2231 227d0d0a
        请求头设置如下:
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        请问有遇到过吗 ? 请大神指点一下,还有你说的那个解析的格式所有的都加上了也还是不行
        汉斯哈哈哈:@寒风孤影 解析出什么错?
        1bd90c3a5fe8:@汉斯哈哈哈 抱歉哈,我们还没上线
        汉斯哈哈哈:@寒风孤影 提供个api,我测试下
      • melody5:你好,我用AF请求回来的JSON有数据丢失现象,返回的数组里少了一个元素,用NSURLSessionDataTask原生的方法就没问题,请大神指教
        请求的连接是这个:https://api.apengdai.com/api/v2/activity/newlist?checkToken=035a4c4895adaccfdec1677e9304aa04&device_id=9b7b2120b6f72bf2022443ace5b396130882e005&stampToken=1468576204000
        汉斯哈哈哈:@meloby 1.检查下其他api有无类似情况 2.看看数据格式有没问题
      • XING99:请求成功,用系统的请求可以接收到并打印,但是用这个为什么result为null。resultObject长度为1,就是没东西
        汉斯哈哈哈:@XING请输入昵称
        1.到沙盒看看有没数据
        2.确定是否json格式是否正确(可以弄个简单的json数据测试)
        3.打印下error,看输出什么信息
        NSError *error;
        NSDictionary *schDic = [NSJSONSerialization JSONObjectWithData:schoolData options:NSJSONReadingAllowFragments error:&error];
        NSLog(@"%@", error);
        XING99:@汉斯哈哈哈 是因为解析的方式,现在新的问题,就是;
        // 存
        NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path=[paths objectAtIndex:0];
        NSString *Json_path=[path stringByAppendingPathComponent:@"JsonSchool.json"];
        [dictData writeToFile:Json_path atomically:YES];
        // 取
        NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path=[paths objectAtIndex:0];
        NSString *Json_path=[path stringByAppendingPathComponent:@"JsonSchool.json"];

        //NSString *schoolPath = [[NSBundle mainBundle] pathForResource:@"sch" ofType:@"json"];
        NSData *schoolData = [NSData dataWithContentsOfFile:Json_path];
        NSDictionary *schDic = [NSJSONSerialization JSONObjectWithData:schoolData options:NSJSONReadingAllowFragments error:nil];


        存进去了,但是取不出来。为什么。
        汉斯哈哈哈:看看error有输出什么
      • 869d26254b81:在线等
      • 869d26254b81:最近应用总是报网络错误提示,我的应用用的是1点多版本的afnetworking,有些方法已经弃用了,而且每个接口都掉了了一次post方法,楼主有没有思路解决这个问题呢?要升级为最新版本吗?
        汉斯哈哈哈:@ar_lxr 还用1.多版本啊,为啥不更新呢?我用的是最新的,没碰到过这问题,你写个demo,测试下出问题的api,如果还是有问题,说明你服务端有问题或自己写的代码问题
      • 漂泊的煙烣:3.x 如何同步 请求?
        漂泊的煙烣:@汉斯哈哈哈 赞
        汉斯哈哈哈:@漂泊的煙烣
        anf用了两个网络请求库NSURLConnection、NSURLSession
        1.NSURLConnection用的是delegate 异步
        2.NSURLSession 异步

        你不如直接用NSURLConnection的同步方法:-[NSURLConnection sendSynchronousRequest:returningResponse:error].

        不过在多线程请求下利用信号量dispatch_semaphore可以这么玩:
        dispatch_async(dispatch_get_global_queue(0, 0), ^{

        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
        NSLog(@"1111111111");
        [[AFHTTPSessionManager manager] GET:@"http://www.weather.com.cn/data/sk/101010100.html" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"2222222222");
        dispatch_semaphore_signal(semaphore);
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"2222222222");
        dispatch_semaphore_signal(semaphore);
        }];
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"333333333");
        });
        打印:
        2016-06-01 18:52:01.111 AFNetwork源码分析[2521:1149134] 1111111111
        2016-06-01 18:52:01.509 AFNetwork源码分析[2521:1149111] 2222222222
        2016-06-01 18:52:01.510 AFNetwork源码分析[2521:1149134] 333333333
      • aae56f0789c8:af把请求参数设置为json类型的时候 把参数做base64加密后 发送给服务器 服务器收到的是为经过base64加密的数据 求解决方法 调试时参数确实加密了 但是在af内部把参数转为二进制时给解密了
        汉斯哈哈哈:@aae56f0789c8 客户端base64加密,服务端对应解密不行么~af不可能对其解密,加密过后就是一段字符串
      • 84ca63b22778:大神 能不能分享一下最新AF的使用方法
      • 84ca63b22778:受教了 谢谢
      • 7879b800b797:返回字符串而并非是json或xml格式,可以通过 返回的错误error里面的userInfo 字典拿到 没有序列化的 data ,response也可以拿到 ,具体去看原码放出来的 那几个erorKey :smile:
        a08448b0e29f:奥,大神们,你们版本更新都是怎么做的?
      • Gwinds:按你的代码打了一遍,我遇到了点问题/Users/doubi/Desktop/屏幕快照 2016-03-30 上午10.57.56.png
      • 身临其境知所然:非常好,学习下
      • 程序狗:在3.0里怎么拿到错误回调?
      • 浩雨雪丹:在AFNetworking里,怎么给cookie加键值对
        汉斯哈哈哈:@浩雨雪丹 [sessionManager.requestSerializer setValue: value forHTTPHeaderField:@"cookie"];
      • 挠叔:很不错~ 学习了~
      • iPhone贴膜小哥:用analyze分析内存泄露:Called function pointer is null

        请问要紧吗?
        汉斯哈哈哈:@墨和米说 贴出代码看下
        iPhone贴膜小哥:我的就是按照您写的代码,我是一个demo项目,
        汉斯哈哈哈:@墨和米说 没碰到过这错,analyze只是静态分析语法之类的错误,你检查下你代码,避免在runtime时崩溃。
      • SANTOS_WU:好习惯!
        钱刀为:哪里可以下载下来看看?
        汉斯哈哈哈:@SANTOS_WU :smiley:

      本文标题:iOS AFNetworking使用技巧与问题(持续更新)

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