NSURLConnection 详解
最后更新于:2022-04-01 14:25:12
首先我们来创建一个URL
~~~
NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"];
~~~
m:mobile专门给手机提供访问的连接
**创建请求对象,根据url向服务器索要数据**
~~~
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];
~~~
- 这个方法里面,我们要做的事情:
- 通过NSMutableURLRequest告诉服务器一些额外的信息
- timeoutInterval:请求超时时长,在指定的时间内,如果没有得到服务器的响应,则认为请求是失败的
- 默认是60s 但是建议在15~30s之间
- cachePolicy 缓存策略
- NSURLRequestUseProtocolCachePolicy = 0, 默认的策略
- NSURLRequestReloadIgnoringLocalCacheData = 1,每次从服务器加载,忽略本地缓存。
- 一般使用在实时性要求很高的应用,股票/12306/
- 下面两个一般使用在开发离线版应用。
- 离线版应用一般需要两个数据库,一个是本地数据库Sqlite3,一个服务器数据库。
- NSURLRequestReturnCacheDataElseLoad = 2, 有缓存,就返回缓存数据,没有就从服务器加载。
- NSURLRequestReturnCacheDataDontLoad = 3, 有缓存,就返回缓存数据,没有就不加载
- 告诉服务器,我是iPhone 并且支持Apple的网页套件
~~~
[request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.7 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.7" forHTTPHeaderField:@"User-Agent"];
~~~
- 将请求对象发送给服务器–(网络访问都是耗时操作,使用异步)
- sendAsynchronousRequest:本身是异步,NSURLConnection内部会开启一条线程进行网络访问
- queue:决定了completionHandler回调所在的线程
- **如何选择队列**
- 如果获得服务器响应的时候,要做耗时操作,则选择自己创建队列,比如下载一个zip包,解压缩
- 如果获得响应后直接更新UI,则选择主队列。
completionHandler:服务器响应客户端的回调。
**response**
本质是NSHTTPURLResponse
- statusCode:状态码,可以根据这个值判断是否请求出错。
- allHeaderFields:获得响应体
- URL:一般使用在重定向,如果不需要重定向,响应的url和请求的url是一样的。
- MIMEType:服务器告诉客户端返回的数据类型,并决定客户端使用什么软件查看内容
-
textEncodingName : 服务器告诉客户端返回内容的编码格式
**下面两个属性一般使用在开发下载功能**
-
expectedContentLength:服务器返回数据的长度,客户端可以通过该属性获得文件大
- suggestedFilename:服务器建议客户端保存文件使用的名字
如下:
~~~
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if(connectionError != nil || data.length == 0) {
NSLog(@"你的网络不给力哦");
return;
}
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
~~~
**加载html**
~~~
[self.webView loadData:data MIMEType:response.MIMEType textEncodingName:response.textEncodingName baseURL:url];
~~~