NSURLConnection探究
来源:互联网 发布:cacti windows 中文版 编辑:程序博客网 时间:2024/06/01 20:10
- (void)viewDidLoad { [super viewDidLoad]; self.progressView.hidden = YES; _progressView = [[YXProgressView alloc] init]; // _progressView.frame = CGRectMake(20, 20, 100, 100); // _progressView.backgroundColor = [UIColor lightGrayColor]; [self.view addSubview:_progressView];}- (IBAction)buttonAction:(id)sender { self.urlString = URL_String3; // 发送同步请求 // [self syncDownloadWithConnection]; // 发送异步请求 // [self asyncDownloadWithBlock]; // 发送代理形式的请求 [self syncDownloadWithDelegate]; }#pragma mark - 懒加载- (NSMutableData *)result { if (_result == nil) { _result = [NSMutableData data]; } return _result;}#pragma mark - NSURLConnection 同步请求/** * 同步请求 */- (void)syncDownloadWithConnection { // 1. 创建url 将字符串类型的地址封装为url NSURL *url = [NSURL URLWithString:self.urlString]; // 2. 创建请求 将url再次封装为一个NSURLRequest对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 创建响应 NSURLResponse 对象 NSURLResponse *response; NSError *error; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (error) { NSLog(@"请求失败:%@",nil); return; } else { // 数据解析 // NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; self.imageView.image = [UIImage imageWithData:data]; // NSLog(@"dict : %@",dict); }}#pragma mark - NSURLConnection 异步请求 -block/** * 异步请求 整体返回数据,不能分布接收 */- (void)asyncDownloadWithBlock { // 网络状态 // 显示网络状态菊花 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; // 1. 创建url 将字符串类型的地址封装为url NSURL *url = [NSURL URLWithString:self.urlString]; // 2. 创建请求 将url再次封装为一个NSURLRequest对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 获取主队列 NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; // block形式的异步请求5.0之后出现的 NSLog(@"开始下载"); [NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; NSLog(@"___block回调,下载完成"); // 强制转为HTTP类型的响应,来使用状态码 // 1. 判断有无数据或者请求成没成功 方式1 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSLog(@"%@",httpResponse); // 方式1 // 有数据并且无错 if (data && connectionError == nil) { } // == 200 就说明请求成功 if (httpResponse.statusCode == 200) { self.imageView.image = [UIImage imageWithData:data]; } else { NSLog(@"下载出错"); } }]; NSLog(@"结束下载"); }#pragma mark - NSURLConnection 代理/** * 同步请求 */- (void)syncDownloadWithDelegate { NSURL *url = [NSURL URLWithString:self.urlString]; // NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 忽略缓存 设置请求的缓存策略 如果超过10秒终没有响应本次请求就不会执行, NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10]; // 代理方法异步下载,当调用这个方法的时候,会自动发送异步请求,代理方法是在主线程中执行的。 [NSURLConnection connectionWithRequest:request delegate:self]; }// 调用它 就证明已经响应,而且已经下载完响应头 开始下载// 这个方法只会在已经响应的时候执行一次,然后返回响应头 response- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { /* 响应头里面的内容 <NSHTTPURLResponse: 0x7f8ab0e1f8d0> { URL: http://img15.3lian.com/2015/f2/52/d/45.jpg } { status code: 200, headers { "Accept-Ranges" = bytes; - > bytes:表示接受,none:表示不接受 "Content-Length" = 249271; "Content-Type" = "image/jpeg"; Date = "Sat, 29 Aug 2015 14:20:21 GMT"; Etag = "\"12d66111d73ad01:0\""; "Last-Modified" = "Wed, 28 Jan 2015 08:47:37 GMT"; Server = "Microsoft-IIS/8.5"; } */ [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; // self.progressView.hidden = NO; // 获取总长度 The expected length of the response’s content. (read-only) self.totalSize = response.expectedContentLength; NSLog(@"response : \n%@",response); }// 调用它 就证明正在接收数据,响应体,真正的响应数据,根据数据的大小反复不间断的接收- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"%@",[NSThread currentThread]); [self.result appendData:data]; CGFloat value = self.result.length/self.totalSize; // self.progressView.progress = value; [_progressView setProgress:value]; NSLog(@"%s",__func__);}// 调用它 就证明已经下载完毕,- (void)connectionDidFinishLoading:(NSURLConnection *)connection { // self.progressView.hidden = YES; self.imageView.image = [UIImage imageWithData:self.result]; NSLog(@"%s",__func__); }// 调用它 就证明链接发生错误 下载失败// 1. 断网了// 2. 网址出错- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { // 关闭状态菊花 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // 隐藏进度条 self.progressView.hidden = YES; NSLog(@"%s",__func__);}
- (void)setProgress:(CGFloat)progress { _progress = progress; NSLog(@"progress - %f",progress); self.label.text = [NSString stringWithFormat:@"%.2f%%",progress * 100]; // 重绘视图的时候调用 // 在View上做一个重绘的标记,当下一次屏幕刷新的时候就会调用 [self setNeedsDisplay];}/**重绘操作仍然在drawRect方法中完成,但是苹果不建议直接调用drawRect方法, 当然如果你强制直接调用此方法,当然是没有效果的 苹果要求我们调用UIView类中的setNeedsDisplay方法, 则程序会自动调用drawRect方法进行重绘。(调用setNeedsDisplay会自动调用drawRect)*/// 当视图显示的时候会调用,默认只会调用一次- (void)drawRect:(CGRect)rect { // 1.获取上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.拼接路径 // 圆的中心 在当前的坐标系统指定圆心位置 CGPoint center = CGPointMake(50, 50); // 画圆 圆的八景 CGFloat radius = 50; // 画圆的起点在最右侧 - 90 度即最顶端 CGFloat startA = -M_PI_2; CGFloat endA = -M_PI_2 + _progress * M_PI * 2; UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES]; CGContextAddPath(ctx, path.CGPath); CGContextStrokePath(ctx); }
0 0
- NSURLConnection探究
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection
- NSURLConnection用法
- NSURLConnection详解
- NSURLConnection小解
- NSURLConnection对象
- inspect相关
- 关于调用子函数给主函数指针分配内存
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- hdoj 2435 There is a war 【求原图最小割已经分成的两个点集 + 枚举两点集里面的点建新边 求残量网络的最大最小割】
- Mac移动硬盘分区无法装载
- NSURLConnection探究
- 存储快照常见实现方式
- 【OpenCV入门教程之八】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波
- LeetCode(263)Ugly Number
- qt mac 使用libusb
- 转:JSON 浅谈 — 1.0 简介
- btrfs连载(一)inode.c之btrfs_create函数
- HDU2.2.6 Digital Roots
- C++中内存分配、函数调用和返回值问题