wordpress建企业网站设置,阿里云 网站建设,wordpress主页js不执行,网站制作方案答案是螃蟹的迷语应iOS小组要求#xff0c;仿写知乎日报需要实现网络请求并解析JSON格式数据#xff0c;这篇文章仅对基本的网络请求和iOS中的JSON解析作以记录#xff0c;还涉及到RunLoop的一点小插曲#xff0c;具体请求过程和原理以后会详细学习#xff01;#x1f64f; 基本网络流程简…应iOS小组要求仿写知乎日报需要实现网络请求并解析JSON格式数据这篇文章仅对基本的网络请求和iOS中的JSON解析作以记录还涉及到RunLoop的一点小插曲具体请求过程和原理以后会详细学习 基本网络流程简单的网络请求示例JSON解析网络请求图示JSON格式也可以通过第三方库JSONModel直接在程序中解析后续将加以学习网络请求其实可通过第三方库AFNetworking来进行为我们简化了许多流程后续将加以学习有关RunLoop的小插曲 基本网络流程
NSURLUniform Resource Locator
URL可直接理解为请求网址如https://v0.yiketianqi.com/api?unescape1versionv9appid72961936appsecretm78Z0m2Tcity北京unescape1
其格式为[协议类型]://[服务器器地址]:[端⼝口号]/[资源层级UNIX⽂文件路路径][⽂文件名]?[查询]#[⽚片段ID]
方法URLWithString:将要请求的地址字符串包装成NSURL对象
NSURLRequest
NSURLRequest对象就代表一个请求 会将NSURL对象以及各种参数设置封装起来无需设置其他参数时方法 (instancetype)requestWithURL:(NSURL *)URL;即可
NSURLSession
一个session可创建多个请求request并负责接收、发送和处理请求 整个程序中也可以有多个session
创建session方法单例sharedSession
session会将request封装成Task 来处理数据
可以看到如果请求逻辑没那么复杂也可直接用第二个方法将NSURL封装成session NSURLSessionTask 用Task类的resume方法来开启请求
简单的网络请求示例
用一个方法dataLoader封装一下最后在Controller中调用次此方法
- (void)dataLoader {self.dict [[NSDictionary alloc] init];NSString* urlString https://v0.yiketianqi.com/api?unescape1versionv9appid72961936appsecretm78Z0m2Tcity北京unescape1;//处理字符//urlString [urlString stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet]];//创建urlNSURL* url [NSURL URLWithString: urlString];//NSURLRequest* request [NSURLRequest requestWithURL: url];//创建sessionNSURLSession* session [NSURLSession sharedSession];//创建taskNSURLSessionTask* task [session dataTaskWithURL: url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!error) {//解析数据//self.dict [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: error];NSLog(%, data);} else {NSLog(请求出现错误%, error);}}];//任务启动开始请求[task resume];
}JSON解析
请求下来的数据是NSData二进制流
下面用一个类NSJSONSerialization将该数据转换成对象用字典接收并打印出来
self.dict [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: error];
NSLog(%, self.dict);解析成对象我们仍旧看不懂这里编码格式是Unicode转义序列这就需要JSON解析Unicode转中文, … , …网上有许多JSON解析在线工具 网络请求图示
下面用一张图展示网络请求流程 JSON格式也可以通过第三方库JSONModel直接在程序中解析后续将加以学习
网络请求其实可通过第三方库AFNetworking来进行为我们简化了许多流程后续将加以学习
有关RunLoop的小插曲
编者一开始其实是在main函数里调用并执行请求的最后发现command Line Tool并没有显示打印内容咨询了zxb10学长发现原来是RunLoop的问题 RunLoop 是一个事件循环负责处理各种事件包括网络请求的回调。在进行异步网络请求时通常会使用回调函数或代理方法来处理请求的响应。这些回调函数或代理方法需要在 Run Loop 中执行才能正确地接收和处理网络请求的响应 在main函数中默认情况下并没有启动RunLoop因此当网络请求的回调发生时由于Runloop没有运行无法处理这些事件包括打印输出而在iOS项目中主线程的RunLoop默认会启动并且在主RunLoop运行期间ta会一直处于运行状态直到应用程序退出。这意味着主线程的RunLoop会不断地处理事件包括网络请求的回调和其他消息
为了解决这个问题可以在main函数中创建一个自定义的RunLoop并在其中执行网络请求。这样网络请求的回调就能够在正确的上下文中被执行从而使打印输出能够正常显示
- (void)dataLoader {// 创建一个自定义 Runloop并运行在主线程上NSRunLoop *runloop [NSRunLoop mainRunLoop];self.dict [[NSDictionary alloc] init];NSString* urlString https://v0.yiketianqi.com/api?unescape1versionv9appid72961936appsecretm78Z0m2Tcity北京unescape1;//创建urlNSURL* url [NSURL URLWithString: urlString];//创建sessionNSURLSession* session [NSURLSession sharedSession];//创建taskNSURLSessionTask* task [session dataTaskWithURL: url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!error) {//解析数据self.dict [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: error];NSLog(%, self.dict);} else {NSLog(请求出现错误%, error);}// 停止自定义 RunloopCFRunLoopStop([runloop getCFRunLoop]);}];//任务启动开始请求[task resume];// 运行自定义 Runloop[runloop run];
}