小工具      在线工具  汉语词典  css  js  c++  java

swift network----使用URLSession的Download Task模式下载多张图片

Swift学习 额外说明

收录于:99天前

1. 说明

NSURLSession是OC中的会话类,在快速地中变成URLSession类,它们的实现方式是一样的,下面的示例就Swift语法进行讲解和介绍。

2、简介:

URLSession类支持3种类型的任务:加载数据、下载和上传。

加载数据:数据任务

下载数据:下载任务

上传数据:上传任务

毫无疑问,Session Task 是整个 URLSession 架构的核心目标。

三。下载 数据:下载任务

前面写过一篇 swift network----利用URLSession的Block模式下载多张图片,主要界面的cell同上,本篇直接贴URLSession的delegate模式下封装好的网络库代码。

1. URL会话URLSessionDownloadDelegate图案下载网络包

import Foundation
import UIKit

public 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.default
        let session  = URLSession(configuration: config, delegate:self, delegateQueue: nil)

        //4、下载任务  -- URLSessionDownloadDelegate 模式
        let loadDataTask = session.downloadTask(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
        }
    }
}


// MARK -  URLSessionDownloadDelegate   URLSessionDataDelegate  URLSessionDownloadDelegate
extension LJSessionRequestManager:URLSessionDownloadDelegate{
    
    //下载进度
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
        
        let  currentBytes :CGFloat = CGFloat(totalBytesWritten)
        let  allTotalBytes :CGFloat = CGFloat(totalBytesExpectedToWrite)
        
        //获取进度
        let proValue :Float = (Float)(currentBytes/allTotalBytes)
        print("----下载进度:------\(proValue*100)%");
        
        weak var weakSelf : LJSessionRequestManager? = self
        DispatchQueue.main.async
            {
                //将接收的数据结果回调到前台,用于进度展示
                weakSelf?.callBackClosure!(nil ,proValue ,nil)
        }
    }
    
    //下载偏移
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) {
        //主要用于暂停续传
    }
    
    //下载结束
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
        //根据下载存储的location位置来获取data数据
        let data = (try? Data(contentsOf: URL(fileURLWithPath: location.path)))
        if callBackClosure != nil ,let data = data{
            
            weak var weakSelf : LJSessionRequestManager? = self
            DispatchQueue.main.async
                {
                    //将接收的数据结果回调到前台,用于进度展示
                    weakSelf?.callBackClosure!(data ,1.0 ,nil)
            }
        }
        /*  保存到相册
         UIImage * image = [UIImage imageWithData:data];
         UIImageWriteToSavedPhotosAlbum(image, nil,nil,nil);
         */
    }
    
    public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    {
        if error != nil  {
            callBackClosure!(nil , 0, error)
        }
    }
}



2. 下面的demo界面UI

 /* Session 的delegate模式下载图片或者数据*/
        LJTask = LJSessionRequestManager()
        LJTask?.sessoinDownload(imageUrlStr,"GET",{ (data ,error)in
            
            //print(names!,ages!)
            //此处如果data有值的话,才去初始化image
            if error == nil, data != nil {
                let newImage = UIImage(data: data! as Data)
                let  titleImage = UIImageView(frame: CGRect(x: 0, y: 5, width: 40, height: 40))
                titleImage.image = newImage
                self.contentView.addSubview(titleImage)
            }
            else
            {
               print(error ?? "")
            }
        })

demo截图


. . .

相关推荐

额外说明

一举突破所有方法,Fiddler和Charles抓包有详细图文教程

一、Fiddler 1.1 Fiddler抓取HTTPS设置 1.1.1 配置证书 Tools菜单 —> Options —> HTTPS —> 勾选Decrypt HTTPS traffic选项。 说明: 勾选Decrypt HTTPS traffic

额外说明

java面试题收集(20)

1、 Java集合 Java 集合类型分为 Collection 和 Map,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。 1、Collection的子接口及其实现类 2、Map 的子接口及其实现类 2、 ArrayList和l

额外说明

爬虫-提取信息-正则表达式

match(): 从字符串起始位置匹配正则表达式 import re content = 'Hello 123 4567 World_This is a Regex Demo' print(len(content)) result = re.match

额外说明

Python爬虫之Scrapy框架系列(7)——XXTop250电影简介信息的获取及存储到本地

前面简单爬取了某Top250电影的一些信息。本文,来尝试搞到每个电影的简介信息。 目录: 1. 获取电影简介信息 1.1 第一步:配对每个电影对应的简介信息: First:包含电影简介信息url的获取 Second:爬虫文件的更改 Third:编写get

额外说明

java使用rabbitmq

前言: 消息中间件,或消息队列的作用总结起来,可以用几个关键词描述,“异步”,“解耦”,“分布式”,“分流”,当然,其他的好处也是围绕这几个关键词展开论述。 分布式:在流行分布式开发的今天,随着开发的团队规模越来越大,业务分布范围越来越广,如何将开发工作

额外说明

Cisco交换机配置

常用命令介绍 interface:int - 接口命令 fastEthernet:f - 百兆以太网 gigabitthernet:g - 千兆以太网 f0/2 :0号槽口中2号端口 switchport mode access :表示该端口的工作模式是

额外说明

MySql坏境配置及安装---详细版

一,下载   1,官网下载所需要的 Mysql版本  官网地址:https://www.mysql.com/  二,解压及安装目录 2,在C盘中命名为一个Mysql文件名,方便下载好的Mysql解压到该文件下 3,下载完的Mysql解压到刚所创建的Mys

额外说明

[线性代数] 常用定义与公式

矩阵和向量 线性运算与转置 矩阵 矩阵的初等变换: 阶梯形矩阵 的定义是: 1. 如果有零行,则都在下面 2. 各非零行的第一个非0元素的列号自上而下严格单调上升。 或者各行左边出现的0的个数自上而下严格单调上升,直到全为0. 台角: 各非零行第一个非0

额外说明

QT案例:登录对话框——主窗口

目录 一、案例涉及知识点 二、案例实现步骤 1、新建一个Qt Widgets Application——MultiWindowDemo 2、创建一个Qt设计师界面类LoginDialog 3、设计登录对话框界面 4、选中【登录】按钮,单击右键,选择“转到

额外说明

如何在WordPress中的发布后自动添加自定义字段

When creating our WPBeginner 画廊网站, we needed to generate custom branded short urls automatically for each site submitted to the

ads via 小工具