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]; ~~~
';