swift 网络----利用URLSession的Data Task下载单张图片(包含图片的增量下载)
一、说明
NSURLSession是OC中的会话类,在Swift中变成URLSession类,它们的实现方式是一样的,下面的示例就Swift语法进行讲解和介绍。
二、介绍:
URLSession 类支持3种类型的任务:加载数据、下载和上传。
加载数据:Data Task
下载数据:Downlaod Task
上传数据:Upload Task
毫无疑问,Session Task是整个URLSession架构的核心目标。
三。 加载数据:Data Task
1. URLSession的URLSessionDataDelegate模式下载网络封装 (包含图片的增量下载)
import Foundation
import UIKitpublic typealias SwiftClosure = ((_ data:Data? , _ progressValue:Float, _ error: Error?) -> Void)class LJSessionRequestManager: NSObject{/*** 定义闭包属性,可选类型*/public var callBackClosure : SwiftClosure?func sessoinDownload(_ url: String, _ method : String , _ callback: @escaping SwiftClosure){callBackClosure = callback//1、创建URL下载地址let url:URL! = URL(string:url);//2、创建Request对象var urlRequest:URLRequest = URLRequest(url:url);urlRequest.httpMethod = method//不需要缓存urlRequest.cachePolicy = .reloadIgnoringLocalCacheData//3、创建会话let config = URLSessionConfiguration.defaultlet session = URLSession(configuration: config, delegate:self, delegateQueue: nil)//4、下载任务 -- URLSessionDataDelegate 模式let loadDataTask = session.dataTask(with: urlRequest)//5、启动任务loadDataTask.resume()}//初始化一个data,用来存储下载下来的数据private var _responseData: NSMutableData!var responseData: NSMutableData!{get{if _responseData == nil {_responseData = NSMutableData()}return _responseData}set{self._responseData = newValue}}
}extension LJSessionRequestManager:URLSessionDataDelegate
{@available(iOS 7.0, *)func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Swift.Void){//允许继续加载数据completionHandler(.allow)}@available(iOS 7.0, *)func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data){//每次获取的data在此拼装print("Data......\(data)")self.responseData.append(data)let currentBytes :Float = Float(self.responseData.length)let allTotalBytes :Float = Float((dataTask.response?.expectedContentLength)!)let proValu :Float = Float(currentBytes/allTotalBytes)print("----下载进度:------\(proValu*100)%");if callBackClosure != nil ,((dataTask.response?.expectedContentLength) != nil){//避免循环引用,weak当对象销毁的时候,对象会被指定为nil//weak var weakSelf = self //对象推到,省略了ViewControllerweak var weakSelf : LJSessionRequestManager? = self //等同与上面的表达式DispatchQueue.main.async{//将接收的数据结果回调到前台,用于进度展示,动态展示下载的图片weakSelf?.callBackClosure!(self.responseData as Data,proValu ,nil)}}}func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?){if callBackClosure != nil ,let data = self.responseData{weak var weakSelf : LJSessionRequestManager? = selfDispatchQueue.main.async{print("数据下载完毕")//将接收的数据结果回调到前台,用于进度展示weakSelf?.callBackClosure!(data as Data ,1.0 ,nil)}}}
}
2. 下面demo界面(包含下载进度条)
import Foundation
import UIKitclass LJNetImageViewController: TFBaseViewController {var progressView : UIProgressView?var progressValue : Float = 0.0var ljImageView : UIImageView?var ljDownLoadManage : LJSessionRequestManager?var imageUrlArray = ["https://raw.githubusercontent.com/onevcat/Kingfisher/master/images/kingfisher-\(/*indexPath.row +*/ 2).jpg","http://image.nationalgeographic.com.cn/2015/0121/20150121033625957.jpg","http://image.nationalgeographic.com.cn/2017/0703/20170703042329843.jpg","http://image.nationalgeographic.com.cn/2017/0702/20170702124619643.jpg","http://image.nationalgeographic.com.cn/2017/0702/20170702124619643.jpg"]override func viewDidLoad() {super.viewDidLoad()self.setTopNavBarTitle("图片下载")self.setTopNavBackButton()self.createDownLoadBtn()self.createProgessView()self.createImageView()}//MARK: -- UIfunc createDownLoadBtn() {let downLoadBtn = UIButton(frame: CGRect(x: (SCREEN_WIDTH - 100)/2.0, y: 120, width: 100, height: 40))downLoadBtn .setTitle("down load", for: UIControlState())downLoadBtn .addTarget(self, action: #selector(LJNetImageViewController.btnClicked(_:)), for: UIControlEvents.touchUpInside)downLoadBtn.backgroundColor = UIColor.grayself.view.addSubview(downLoadBtn)}
//MARK: 进度条func createProgessView() {progressView = UIProgressView.init(progressViewStyle: .default)progressView?.frame = CGRect(x: 0, y: 65, width: SCREEN_WIDTH, height: 1)progressView?.progressTintColor = UIColor.redprogressView?.trackTintColor = UIColor.blackself.view.addSubview(progressView!)}func createImageView(){ljImageView = UIImageView(frame: CGRect(x: (SCREEN_WIDTH - 200)/2.0, y: 180, width: 200, height: 200))self.view.addSubview(ljImageView!)}func loadNetImage() {ljDownLoadManage = LJSessionRequestManager()ljDownLoadManage?.sessoinDownload(imageUrlArray[1], "GET", { (data, progressValue ,error) in//避免循环引用,weak当对象销毁的时候,对象会被指定为nil//weak var weakSelf = self //对象推到,省略了ViewControllerweak var weakSelf : LJNetImageViewController? = self //等同与上面的表达式DispatchQueue.main.async {weakSelf?.progressView?.setProgress(progressValue, animated: true)print("------进度打印:\(progressValue)")if error == nil, data != nil{let image = UIImage(data: data!)weakSelf?.ljImageView?.image = image}}})}func btnClicked(_ sender: UIButton){//progressValue = progressValue + 0.1//progressView?.setProgress(progressValue, animated: true)self.loadNetImage()}
}
控制台打印数据
Data......5544 bytes
----下载进度:------97.1827%
------进度打印:0.933892
Data......1386 bytes
----下载进度:------97.815%
------进度打印:0.940215
Data......1386 bytes
----下载进度:------98.4472%
------进度打印:0.946537
Data......2772 bytes
----下载进度:------99.7117%
Data......632 bytes
----下载进度:------100.0%
------进度打印:0.971827
------进度打印:0.97815
------进度打印:0.984472
数据下载完毕
------进度打印:0.997117
------进度打印:1.0
swift 网络----利用URLSession的Data Task下载单张图片(包含图片的增量下载)相关推荐
- 蓄力-利用POI进行excel的导入导出(包含图片)
这里写自定义目录标题 利用POI进行excel的导入导出 引入的jar包 excel导入 主方法: 将excel里面的图片转成数据 xls格式 xlsx格式 将图片数据转成字节流的方式传输到FTP服务 ...
- Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求
Alamofire网络库基础教程:使用 Alamofire 轻松实现 Swift 网络请求 转自 http://www.cocoachina.com/ios/20141202/10390.html 本 ...
- Swift 网络请求数据与解析
一: Swift 网络数据请求与处理最常用第三方 又有时间出来装天才了,还是在学swift,从中又发现一些问题,这两天上网找博客看问题弄的真的心都累.博客一篇写出来,好多就直接照抄,就没有实质性的把问 ...
- swift网络数据请求方法
搭建一个apache服务器,用php编写一个返回给客户端请求数据的脚本 1 <?php2 //header("Content-type:text/html;charset=utf-8& ...
- Swift网络开发之NSURLSession学习笔记
为什么80%的码农都做不了架构师?>>> Swift网络开发之NSURLSession学习笔记 先上效果图: 功能: -单个任务下载 -暂停下载任务 -取消下载任 ...
- 网络相关篇Linux一句话精彩问答--2006/09/08更新--20060908pdf版本下载
----------------------------网络相关篇-------------------------- 2001 让apache的默认字符集变为中文(陈绪) vi httpd.conf ...
- Java网络编程从入门到精通(24):实现HTTP断点续传下载工具(附源代码)
源代码下载:download.rar 在前面的文章曾讨论了HTTP消息头的三个和断点继传有关的字段.一个是请求消息的字段Range,另两个是响应消息字段Accept-Ranges和Content-Ra ...
- 网络编程学习(10)/ FTP项目(4) ——文件下载和下载断点续存功能
网络编程学习(10)/ FTP项目(4) --文件下载和下载断点续存功能 服务端 `lib 文件夹下 main.py` 客户端 `client文件夹下 FTPClient.py 代码 interact ...
- 树莓派sd卡格式化_利用树莓派和移动硬盘搭建下载机,常见视频网站都可下载...
前言 一直想搭建一个下载机,查了很多资料,觉得树莓派+移动硬盘应该是最好的选择.树莓派是比较小众的东西,它可不是什么吃的,它是一台完整的微型电脑.对于树莓派,下载只是很小的一个功能. 树莓派 终于下手 ...
- php取网盘真实链接,利用蓝奏做个人小文件网盘和获取真实下载地址
原标题:利用蓝奏做个人小文件网盘和获取真实下载地址 之前已经有人分享过蓝奏云盘直链获取教程和源码,但是或已经失效,或只能用于电脑. 按照之前网友分享的思路,对蓝奏的手机端页面进行分析: 分享的网盘链接 ...
最新文章
- 设计模式总结——代理模式以及java的动态代理
- python输入什么就输出什么意思_一文读懂Python的输入和输出
- python queue 查询是否在队列中_python队列Queue的详解
- 【离散数学】基础理论归纳
- jqgrid表格下拉搜索多选框优化—使用select下拉多选插件
- python123组合数据类型_Python的组合数据类型-字典
- 《数学计算出题系统》功能规格说明书
- Erlang编程语言的一些痛点
- centos7搭建ELK Cluster集群日志分析平台(四):Fliebeat-简单测试
- Latex:IEEE Trans期刊Latex模板下载
- 共轭先验分布及其应用
- (附源码)计算机毕业设计SSM基于ETC用户的自驾游推荐系统
- 【论文笔记】《SketchMate: Deep Hashing for Million-Scale Human Sketch Retrieval》
- 如何查看win 10 无线密码
- 如何看待越来越多人报名参加软考?
- 搜索引擎的网站登录入口
- 分享为部门做的《Qt入门介绍》PPT课件
- 论VI设计的基础部分和应用部分
- 遗传算法解决8数码难题——Java
- Origin绘图技巧——组合图
热门文章
- 如何在校外下载期刊全文应对大家工作后的资料搜寻
- Ubuntu安装谷歌拼音输入法
- eclipse svn插件下载地址
- 2021年危险化学品生产单位安全生产管理人员试题及解析及危险化学品生产单位安全生产管理人员模拟试题
- 构建病毒宿主关系知识图谱
- epic怎么添加本地游戏_节奏大师怎么玩自制歌曲?节奏大师添加本地歌曲方法_APP教程...
- 探讨破解3G今日困局之策
- firemonkey mysql_FireMonkey开发技术简明手册.pdf
- Delphi D10.X VCL和FireMonkey之间的常见差异介绍
- 搭建本地git代码管理,实现内网Windows进行代码管理