iOS网络--同步,异步下载数据
一、
这一节我们来学习几种下载数据的方式,目的在于学习同步,异步下载数据的知识。
二、
1.直接同步下载数据
//直接下载 同步下载 阻塞主线程
NSURL * url = [NSURL URLWithString:@"http://127.0.0.1/upload/image/timg.png"];
NSData * imageData = [NSData dataWithContentsOfURL:url];
UIImage * image = [UIImage imageWithData:imageData];
//显示图片
self.imageView.image = image;
这里我们直接使用一个url就去获取数据,这种获取数据的方式就是同步的方式。这种方式会阻塞主线程,表现出来的效果就是用户界面卡顿。
2.通过请求同步下载数据
//直接下载 同步下载 阻塞主线程
NSURL * url = [NSURL URLWithString:@"http://127.0.0.1/upload/video/1.mp4"];
//创建请求
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//发起连接
[NSURLConnection connectionWithRequest:request delegate:self];
这里我们创建了一个URL,然后通过这个URL来创建一个NSURLRequest,然后使用[NSURLConnection connectionWithRequest:delegate:]这个方法来发送同步请求。注意delegate参数表示回调的对象。所以我们要在这个类中实现数据回调的方法:
2.1.接收到响应头的方法,一般通过这个方法来计算所请求的数据的大小。
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{//服务器端返回客户端的响应信息,描述客户端请求的数据的详细信息NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;//获取文件的大小self.size = httpResponse.expectedContentLength;//创建容器self.mediaData = [NSMutableData dataWithCapacity:self.size];}
2.2.真实的获取数据的方法
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{//服务器端向客户端返回的数据包//保存数据[self.mediaData appendData:data];//计算进度CGFloat rate = data.length*1.0/self.size;//显示到progressviewself.progressView.progress += rate;//lable显示self.progressLabel.text = [NSString stringWithFormat:@"%.1f%\%",self.progressView.progress*100.0];
}
这个方法是真正的回调数据的方法,一般我们都需要将获取到的数据添加到一个可变的数据(NSMutableData) 里面。
2.3.数据下载完毕回调的方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{//数据下载完毕UIImage * image = [UIImage imageWithData:self.mediaData];self.imageView.image = image;
}
在这个方法中我们才知道数据真正下载完毕了,才去做相关的操作。由于是同步的,所以在主线程中,所以在这里面可以直接操作UI。
3.通过请求异步下载数据
NSURL * url = [NSURL URLWithString:@"http://127.0.0.1/upload/image/timg.png"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSLog(@"%@",[NSThread currentThread]);
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {//在主线程中操作UIUIImage * image = [UIImage imageWithData:data];NSLog(@"%@",[NSThread currentThread]);//显示图片 将UI操作放在主线程self.imageView.image = image;
}];
这里我们创建了一个URL,然后通过这个URL来创建一个NSURLRequest,接着使用[NSURLConnection sendAsynchronousRequest:queue: completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {}],来发送这个请求,这个请求是异步请求。通过一个block回调数据。在block中进行相关的操作,需要注意的是如果block中是对UI的操作,应该在主线程中做,那么前面的queue传递的参数就应该是主队列。
iOS网络--同步,异步下载数据相关推荐
- (九)深入浅出TCPIP之网络同步异步
目录 专栏其他文章: 同步和异步 同步与异步的例子 使用场景 代码示例 专栏其他文章: </
- Android多线程分析之一:使用Thread异步下载图像
打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Mess ...
- 【游戏开发】多人游戏网络同步相关技术(基础原理篇)
常见网络同步模型 1.C/S 模型 (Client-Server) : 状态同步 2.对等网络模型(Peer-To-Peer): 帧同步 网络同步数据类型 将数据分为四个类型 非保障数据(可丢弃) 保 ...
- 网络同步在游戏历史中的发展变化 — 优化技术总结
目录(终篇): 六.TCP VS UDP 七.常见同步优化技术 1.表现优化 - 插值优化 - 客户端预先执行+回滚 2.延迟对抗 - 延迟补偿 - 命令缓冲区 - 通过具体的实现技巧 3.丢包对抗 ...
- 网络同步在游戏历史中的发展变化(六)—— 优化技术总结(完结篇)
这是[游戏开发那些事]的第44篇原创 点击关注加"星标"获取更多游戏开发知识与科普文章 目录(终篇): 六.TCP VS UDP 七.常见同步优化技术 1.表现优化 - 插值优化 ...
- iOS网络开发中的同步、异步和请求队列
在iOS网络编程中,我们经常会遇到线程的同步和异步问题,同时为了对异步请求更加精准丰富的控制,我们还常常在iOS中使用请求队列,下面就来谈谈iOS开发中同步.异步以及请求队列的使用方法. 1. 同步意 ...
- iOS网络编程之同步、异步、请求队列
1. 同步意为着线程阻塞,在主线程中使用此方法会不响应任何用户事件.所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替. - (IBAction)grabURL:(id)se ...
- IOS开发基础之异步下载网络图片第1部分
IOS开发基础之异步下载网络图片第1部分 加入ATS // LJAppInfo.h // 37-异步下载网络图片 // Created by 鲁军 on 2021/3/10. #import < ...
- iOS网络编程-iCloud键值数据存储编程实例
iCloud键值数据存储设计 iCloud键值数据存储编程实例,画面中有两个开关控件,左图是设备1点击"设置iCloud数据"按钮,将控件状态保存到iCloud服务器.右图是设备2 ...
最新文章
- cli3暴露api地址 vue_手把手教你开发 Vue 组件库
- Cordova环境搭建
- java隐含转化_java中自动转换和强制转换还有隐含转换
- 洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏
- sbt 地址修改备注
- CSDN积分赚取方法
- cognos报表制作学习(一)cognos如何新建普通的reportstudio报表
- 侧信道攻击之模板攻击
- inspinia admin 最新版 inspinia 2.7.1 一套非常优秀的bootstrap后台管理模板
- 千月影视v20 全新UI原生双端投屏加选集加H5全套程序2022最新版
- 十分钟利用windows7漏洞破解开机密码
- iconst、bipush、sipush、ldc指令的区别
- 约瑟夫出圈问题之幼儿园做游戏
- Java面试题(九)-----编写程序实现判断E: / 根目录下是否有后缀名为.jpg的文件,如果有则输出文件名称
- 从某一点出发沿任意一方向旋转矩阵计算思考与实现
- python快速搭建本地服务器
- P1941 [NOIP2014 提高组] 飞扬的小鸟
- opencv4算法库学习笔记(5万多字超长干货——纪念奋战的自己)
- python语言编写的modbus协议_基于Python的ModbusTCP客户端实现
- dell服务器数据恢复(dell 数据恢复)