NSURLConnection探究
2015-08-29 22:27
267 查看
- (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); }
相关文章推荐
- 【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑
- Hibernate 缓存机制
- java mysql 编码总结
- UITextView keyboard
- C++拷贝构造函数
- 第五章:C++程序的结构
- 词频统计 求最大k个数
- 【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀
- iOS Working with Streams 处理流 官方文档翻译(四)
- 【OpenCV入门教程之九】 非线性滤波专场:中值滤波、双边滤波
- HDU2.2.6 Digital Roots
- oracle创建表空间和账户
- 谈谈spring中的拦截器interceptor
- C++中内存分配、函数调用和返回值问题
- hdoj 2435 There is a war 【求原图最小割已经分成的两个点集 + 枚举两点集里面的点建新边 求残量网络的最大最小割】
- C# ref 和 out ,params关键字的用法
- linux重新增加硬盘容量
- C++ char* str与char str[]
- 【OpenCV入门教程之八】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波
- 关于调用子函数给主函数指针分配内存