tags: OC 30 day
获取网路数据的两种方式:
方式一:NSData
方法: 获取JSON,修改伺服器内的JSON,重新下载。製作一个API接口缺点: 无法放置缓存策略,超时时长,请求我们来複习一下如何使用NSData获取数据。
//第一种方式 获取网路数据 NSURL *url = [NSURL URLWithString:@"https://run.mocky.io/v3/39057ccc-3332-4a2f-a88f-7bd259f078b0"]; NSData *data = [NSData dataWithContentsOfURL:url]; NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str);
方式二:NSURLConnection
特点: 可以异步发送请求,可以通过NSMutableRequest设置缓存策略,超时时长,header。 //第二种方式 获取网路数据 NSURL *url = [NSURL URLWithString:urlStr]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); }];
有两种方式,有哪一种好呢?
第二种方式好
因为第一种方式,很多事情不能做,哪些事情呢?
第一种方式,没办法设置header,也有很多种请求资讯无法操作。
如何利用第二种方式请求header?
NSMutableURLRequest *request = [NSURLRequest requestWithURL:url]; //设置请求头 [request setValue:你要设置的value forHTTPHeaderField: 你要设置的键];
如何设置缓存策略
配置参数时,可以看到三个参数设定,如下
URL缓存策略时长 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:<#(nonnull NSURL *)#> cachePolicy:<#(NSURLRequestCachePolicy)#> timeoutInterval:<#(NSTimeInterval)#>];
缓存策略有哪几种?
我们来看看NSURLRequestCachePolicy是如何被定义的
NSURLRequestCachePolicy因为有好几种,所以他是一个枚举。
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy){ NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3,};
http协议的缓存策略 0
NSURLRequestUseProtocolCachePolicy
忽略本地缓存 加载最新数据 1
NSURLRequestReloadIgnoringLocalCacheData
如果有缓存,返回缓存数据,否则重新下载 2
NSURLRequestReturnCacheDataElseLoad
返回缓存数据,没有缓存也不下载网路数据 3
NSURLRequestReturnCacheDataDontLoad
永远不打API,主要用在离线运用。
默认情况下,我们选择0的缓存策略。
以下是範例的程式码。
NSURL *url = [NSURL URLWithString:urlStr]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15];
那么如果不客制请求,请求是什么型态呢?
我们来查看下面这个网路请求的定义。
NSMutableURLRequest *request = [NSURLRequest requestWithURL:url];
可以看到下面这段网路请求的注解
/*! @method requestWithURL: @abstract Allocates and initializes an NSURLRequest with the given URL. @discussion Default values are used for cache policy (NSURLRequestUseProtocolCachePolicy) and timeout interval (60 seconds). @param URL The URL for the request. @result A newly-created and autoreleased NSURLRequest instance.*/
在这段注解裏,你会发现几个问题:
超时时长60秒,合适吗?
不合适,让使用者等待60秒的时间,太长了。你觉得合适的时间是几秒呢?欢迎在下面留言给我。