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

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

Swift学习 额外说明

收录于:42天前

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截图


. . .

相关推荐

额外说明

SQL-存在

文章目录 前言 案例 扩展 前言 exists用于where条件语句之后,属于子查询的一种形式。 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。 案例 查询指定表,如果满足exists条

额外说明

SpringBoot配置信息加密(jasypt)

一、前言 在我们配置文件中,经常有一些敏感的数据,比如数据源的用户名、密码、连接地址等,如果一旦这些数据泄露,那么将导致我们的数据源暴露,为了避免这一种情况发生,可以将这些敏感信息进行加密处理。 二、实现 1、引入以下依赖 <dependency>

额外说明

springboot环境下将对象注入到工具类中或者静态方法中将对象注入到工具类中

众所周知工具类一般为static的,如果我们在工具类中需要操作数据库,那么spring环境下需要注入service或者dao将对象交给spring进行管控,但是静态的的对象是无法被注入的,代码可能会出现各种空指针。需要采用@PostConstruct注解

额外说明

spring工程相互依赖关系(最为常用,必会精华)

目录 1. 了解两个xml 的标签 标签一:  compile 标签二: true 资源认证的 常用依赖(公共) 待续未完!!! 创建工程 公共工程  完成初始化  配置xml文件   util包和 依赖都放到公共工程 1. 了解两个xml 的标签 下列

额外说明

UnityXR 之VR射线 3D物体与UI的简单交互设置

因项目需求需要开发一款HDRP的VR项目 原先老的一套VRTK和Stemar 在新版本已经不适应了,虽然我找到了 VRTK4.0,但是用起来和别的插件总是有冲突的情况,而且学习成本更大了,经过了解unity官方推荐了XR,废话不多说直接上最基础的开发流程

额外说明

TensorFlow2 手把手教你避开梯度消失和梯度爆炸

TensorFlow2 手把手教你避开梯度消失和梯度爆炸 梯度消失 & 梯度爆炸 梯度消失 梯度爆炸 张量限幅 tf.clip_by_value tf.clip_by_norm mnist 展示梯度爆炸 完整代码 输出结果 梯度消失 & 梯度爆炸 输出结

额外说明

【Unity3D日常开发】Unity Editor自定义快捷键

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、前言 在使用Unity中可能需要使用快捷键执行一些操作,或者修改Unity自带的快捷键,接下来就看一下,如何设置自定义快捷键吧

额外说明

如何让VsCode自动格式化代码?

文章目录 一、展示格式混乱的代码 二、设置粘贴、保存时自动格式化代码 三、演示代码自动格式化 一、展示格式混乱的代码 虽然不影响程序运行结果,但是代码看着混乱不堪,如果手动格式化,那真是费事! 二、设置粘贴、保存时自动格式化代码 File - Prefe

额外说明

系统缺失d3dx10_36.dll文件导致软件或游戏无法运行怎么办?

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个d3dx10_36.dll文

ads via 小工具