iOS 解决 http请求返回json解析 出现-[__NSCFDictionary bytes]: unrecognized selector sent to instance xxx 错误

致孤独的我们


在我们发送了http请求之后,返回responseData数据的时候,我们准备对数据解析成Json格式的时候,报了这样的错误:-[__NSCFDictionary bytes]: unrecognized selector sent to instance xxx,这种情况下,首先检查我们的使用了哪个类发送了http请求,如果发现自己用的AFNetwork 三方库进行发送,那么问题基本上有了答案,就是: 我们把一个NSDictionary对象当成Data 直接 通过NSJsonObject 对象转换为NSDictionary 对象,所以出现了错误。

解决:_NSCFDictionary  你用的AFNetwork, 他已经帮你转化好了,responseObject的数据类型已经是字典了 ,接下来,直接对这个字典进行操作就好了

顺便普及一下AFNetwork:

概述

我们今天是来深入研究一下这个与我们日常开发密切相关的框架是如何实现的。

这是我对 AFNetworking 整个架构的理解,随后一系列的文章也会逐步分析这些模块。

在这篇文章中,我们有两个问题需要了解:

如何使用 NSURLSession 发出 HTTP 请求

如何使用 AFNetworking 发出 HTTP 请求

NSURLSession

NSURLSession以及与它相关的类为我们提供了下载内容的 API,这个 API 提供了一系列的代理方法来支持身份认证,并且支持后台下载。

使用NSURLSession来进行 HTTP 请求并且获得数据总共有五个步骤:

实例化一个NSURLRequest/NSMutableURLRequest,设置 URL

通过- sharedSession方法获取NSURLSession

在 session 上调用- dataTaskWithRequest:completionHandler:方法返回一个NSURLSessionDataTask

向 data task 发送消息- resume,开始执行这个任务

在 completionHandler 中将数据编码,返回字符串

NSMutableURLRequest*request= [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"https://github.com"]];NSURLSession*session= [NSURLSession sharedSession];NSURLSessionDataTask*task= [session dataTaskWithRequest:request                                      completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {                                          NSString*dataStr= [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];                                          NSLog(@"%@", dataStr);                                      }];[task resume];

这一段代码可以说是使用NSURLSession发送请求最简单的一段代码了,当你运行这段代码会在控制台看到一坨github首页的 html。

AFNetworking

AFNetworking 的使用也是比较简单的,使用它来发出 HTTP 请求有两个步骤

以服务器的主机地址或者域名生成一个 AFHTTPSessionManager 的实例

调用- GET:parameters:progress:success:failure:方法

AFHTTPSessionManager*manager= [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:@"hostname"]];[manager GET:@"relative_url"parameters:nil progress:nil    success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSLog(@"%@" ,responseObject);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        NSLog(@"%@", error);    }];

注意:在 iOS9 中,苹果默认全局 HTTPs,如果你要发送不安全的 HTTP 请求,需要在 info.plist 中加入如下键值对才能发出不安全的 HTTP 请求

还有一件事情是要注意的是,AFNetworking 默认接收 json 格式的响应(因为这是在 iOS 平台上的框架,一般不需要 text/html),如果想要返回 html,需要设置acceptableContentTypes

AFNetworking 的调用栈

在这一节中我们要分析一下在上面两个方法的调用栈,首先来看的是AFHTTPSessionManager的初始化方法- initWithBaseURL:

- [AFHTTPSessionManager initWithBaseURL:]    - [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]        - [AFURLSessionManager initWithSessionConfiguration:]            - [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]            - [AFJSONResponseSerializer serializer]// 负责序列化响应- [AFSecurityPolicy defaultPolicy]// 负责身份认证- [AFNetworkReachabilityManager sharedManager]// 查看网络连接情况- [AFHTTPRequestSerializer serializer]// 负责序列化请求- [AFJSONResponseSerializer serializer]// 负责序列化响应

从这个初始化方法的调用栈,我们可以非常清晰地了解这个框架的结构:

其中AFURLSessionManager是AFHTTPSessionManager的父类

AFURLSessionManager负责生成NSURLSession的实例,管理AFSecurityPolicy和AFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,它有一个AFJSONResponseSerializer的实例来序列化 HTTP 响应

AFHTTPSessionManager有着自己的AFHTTPRequestSerializer和AFJSONResponseSerializer来管理请求和响应的序列化,同时依赖父类提供的接口保证安全、监控网络状态,实现发出 HTTP 请求这一核心功能

初始化方法很好地揭示了 AFNetworking 整个框架的架构,接下来我们要通过分析另一个方法- GET:parameters:process:success:failure:的调用栈,看一下 HTTP 请求是如何发出的:

- [AFHTTPSessionManager GET:parameters:process:success:failure:]    - [AFHTTPSessionManager dataTaskWithHTTPMethod:parameters:uploadProgress:downloadProgress:success:failure:]// 返回 NSURLSessionDataTask #1- [AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:]// 返回 NSMutableURLRequest- [AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:]// 返回 NSURLSessionDataTask #2- [NSURLSession dataTaskWithRequest:]// 返回 NSURLSessionDataTask #3- [AFURLSessionManager addDelegateForDataTask:uploadProgress:downloadProgress:completionHandler:]                - [AFURLSessionManagerTaskDelegate init]                - [AFURLSessionManager setDelegate:forTask:]    - [NSURLSessionDataTask resume]

在这里#1#2#3处返回的是同一个 data task,我们可以看到,在#3处调用的方法- [NSURLSession dataTaskWithRequest:]和只使用NSURLSession发出 HTTP 请求时调用的方法- [NSURLSession dataTaskWithRequest:completionHandler:]差不多。在这个地方返回 data task 之后,我们再调用- resume方法执行请求,并在某些事件执行时通知代理AFURLSessionManagerTaskDelegate

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容