NSURL请求解析
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 获取JSON数据
// 在实际开发中几乎用不到
// NSData *data = [NSData dataWithContentsOfURL:@""];
/**
- 因为默认时长是60S 没有办法修改 而且没有缓存策略
- dataWithContentOfURL 是同步方法
- 没有错误处理机制
*/
// 使用网络来获取数据
NSURL *url = [NSURL URLWithString:@""];
// NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 使用缓存策略
/**
* timeoutInterval 超时时长 默认的是60秒 一般在实际开发的过程中建议:15-30秒 太短了可能服务器来不及做出响应 太长了用户等待太久了 也影响用户体验
- SDWebImage 默认时长 15S
- AFNetworking 默认时长 60S
* cachePolicy 缓存策略
四种缓存策略
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
// 默认缓存策略
NSURLRequestUseProtocolCachePolicy = 0,
// 忽略本地服务器的缓存数据 直接加载网络数据 也就是每次都请求 每次都是最新数据
应用场景为:数据变化非常频繁的App 比方说股票 彩票等
NSURLRequestReloadIgnoringLocalCacheData = 1,
*** 以下两个选项,专门用户离线浏览的 建议结合 Reachability 框架联合使用
- 如果用户当前没有网络 我们就是用本地缓存策略
- 如果有网络 就是用默认缓存策略
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
NSURLRequestReturnCacheDataElseLoad = 2, // 返回缓存数据 如果没有缓存 从服务器加载
NSURLRequestReturnCacheDataDontLoad = 3, // 返回缓存数据 如果没有缓存 则空着
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
};
*/
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15.0];
// 异步发送 带有错误处理机制!
/**
* request 请求
* queue 调度任务的队列
指定调度回调代码块的队列 决定了回调的代码块执行队列
- 主队列回调的代码块在主线程上执行
- 新建队列 就会在其他线程执行回调代码
如何选择?判断是否需要更新UI
如果我们网络获取到数据之后需要立马刷新UI则使用主队列
* 3.block 回调代码块 在网络请求结束后执行的
3.1 response 服务器的响应
response(NSHTTPURLRequest)
URL 服务器返回的URL 绝大部分和请求的URL是一样的 有的时候不一样 “重定向(根据电脑硬件处理)”
MIMEType 二进制数据的文件类型 服务器会告诉客户端 可以使用什么软件打开二进制数据
expectedContentLength 下载文件的长度
textEncodingName 文本编码名称 大多是UTF8
suggestedFilename 服务器建议保存的文件名称
statusCode 状态吗 2XX 3XX 重定向 4XX客户端错误 5XX服务器错误
allHeaderFields 所有响应头内容
3.2 data 数据实体 程序员开发最关心的
3.3 error 错误处理
注意:有一种情况是没有错误,也没有数据!!
if (connestionError || data == nil){
NSLog(@"你的网络不给力 请稍后再试!");
}
*/
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSLog(@"%@",response);
NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",json);
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
JSON解析详解
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSURL *url = [NSURL URLWithString:@""];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15.0];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 解析数据
// 二进制数据-->OC对象 : 反序列化
// 装着字典的数组
// NSJSONSerialization JSONObjectWithData 能够将网络返回的二进制数据转换为字典或者数组
// JSON本质上就是一个特殊格式的字符串
// JSON出自于民间 后来被广泛使用
/**
顶级节点必须是NSArray 或者是NSDictionary
所有的对象必须是 NSString NSArray NSNumber NSDictionary NSNull
所有的字典的Key必须是NSString
所有的NSNumbers不能使无理数或者空
*/
/**
typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
// 容器节点是可变的
NSJSONReadingMutableContainers = (1UL << 0),
// 子节点是可变的
NSJSONReadingMutableLeaves = (1UL << 1),
// 允许顶级节点不是NSArray 或者 NSDictionary
NSJSONReadingAllowFragments = (1UL << 2)
} NS_ENUM_AVAILABLE(10_7, 5_0);
*/
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@ %@",result,[result class]);
// NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// NSLog(@"%@",result);
}];
}
//MARK : --关于枚举
/**
C语言定义枚举的类型,枚举的数据类型是不确定的,会默认的使用 int
从iOS 6.0之后推出两个宏 NS_ENUM NS_OPTIONS
NS_ENUM 定义枚举的同时 可以指定数据的类型
NS_OPTIONS 定义的枚举是位移的 可以用按位 或 设置数值
一般看到 NS_OPTIONS 定义的枚举 直接传入0 作为参数 表示什么附加操作也不做 效率最高!
*/
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
网友评论