一、

这一节我们来学习几种下载数据的方式,目的在于学习同步,异步下载数据的知识。

二、

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网络--同步,异步下载数据相关推荐

  1. (九)深入浅出TCPIP之网络同步异步

    目录 专栏其他文章: 同步和异步 同步与异步的例子 使用场景 代码示例 专栏其他文章: </

  2. Android多线程分析之一:使用Thread异步下载图像

    打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Mess ...

  3. 【游戏开发】多人游戏网络同步相关技术(基础原理篇)

    常见网络同步模型 1.C/S 模型 (Client-Server) : 状态同步 2.对等网络模型(Peer-To-Peer): 帧同步 网络同步数据类型 将数据分为四个类型 非保障数据(可丢弃) 保 ...

  4. 网络同步在游戏历史中的发展变化 — 优化技术总结

    目录(终篇): 六.TCP VS UDP 七.常见同步优化技术 1.表现优化 - 插值优化 - 客户端预先执行+回滚 2.延迟对抗 - 延迟补偿 - 命令缓冲区 - 通过具体的实现技巧 3.丢包对抗 ...

  5. 网络同步在游戏历史中的发展变化(六)—— 优化技术总结(完结篇)

    这是[游戏开发那些事]的第44篇原创 点击关注加"星标"获取更多游戏开发知识与科普文章 目录(终篇): 六.TCP VS UDP 七.常见同步优化技术 1.表现优化 - 插值优化 ...

  6. iOS网络开发中的同步、异步和请求队列

    在iOS网络编程中,我们经常会遇到线程的同步和异步问题,同时为了对异步请求更加精准丰富的控制,我们还常常在iOS中使用请求队列,下面就来谈谈iOS开发中同步.异步以及请求队列的使用方法. 1. 同步意 ...

  7. iOS网络编程之同步、异步、请求队列

    1. 同步意为着线程阻塞,在主线程中使用此方法会不响应任何用户事件.所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替. - (IBAction)grabURL:(id)se ...

  8. IOS开发基础之异步下载网络图片第1部分

    IOS开发基础之异步下载网络图片第1部分 加入ATS // LJAppInfo.h // 37-异步下载网络图片 // Created by 鲁军 on 2021/3/10. #import < ...

  9. iOS网络编程-iCloud键值数据存储编程实例

    iCloud键值数据存储设计 iCloud键值数据存储编程实例,画面中有两个开关控件,左图是设备1点击"设置iCloud数据"按钮,将控件状态保存到iCloud服务器.右图是设备2 ...

最新文章

  1. cli3暴露api地址 vue_手把手教你开发 Vue 组件库
  2. Cordova环境搭建
  3. java隐含转化_java中自动转换和强制转换还有隐含转换
  4. 洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏
  5. sbt 地址修改备注
  6. CSDN积分赚取方法
  7. cognos报表制作学习(一)cognos如何新建普通的reportstudio报表
  8. 侧信道攻击之模板攻击
  9. inspinia admin 最新版 inspinia 2.7.1 一套非常优秀的bootstrap后台管理模板
  10. 千月影视v20 全新UI原生双端投屏加选集加H5全套程序2022最新版
  11. 十分钟利用windows7漏洞破解开机密码
  12. iconst、bipush、sipush、ldc指令的区别
  13. 约瑟夫出圈问题之幼儿园做游戏
  14. Java面试题(九)-----编写程序实现判断E: / 根目录下是否有后缀名为.jpg的文件,如果有则输出文件名称
  15. 从某一点出发沿任意一方向旋转矩阵计算思考与实现
  16. python快速搭建本地服务器
  17. P1941 [NOIP2014 提高组] 飞扬的小鸟
  18. opencv4算法库学习笔记(5万多字超长干货——纪念奋战的自己)
  19. python语言编写的modbus协议_基于Python的ModbusTCP客户端实现
  20. dell服务器数据恢复(dell 数据恢复)

热门文章

  1. 【周星驰电影全集下载】年表
  2. 自动化测试和数据驱动之间的关系,十分钟带你弄清楚
  3. Shell编程之循环语句(for、while、until)
  4. Java经典面试题详解:不敢跟面试官对线?一招彻底弄懂!
  5. SQL分类和命名规范
  6. Linux编辑器之Vi、Vim的使用及技巧篇
  7. Facebook和旗下Instagram起诉4家中国公司商标侵权
  8. 【超详细Django网站开发过程4】便利店管理系统之——销售员如何获取顾客数据?即:读取数据库数据(浏览器请求数据——服务器返回数据)
  9. Linux自动挂载 (autofs)
  10. 金山词霸可真是个优秀软件