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

Swift使用Opration和OprationQueue下载网络图片

Swift学习 额外说明

收录于:43天前

1. 基于Opration封装的获取网络数据组件

import Foundation
import UIKit

public typealias OpreationClosure = ((_ data:Data? , _ error: Error?) -> Void)

class LJOpreationManager: Operation {
    
    /**
     *  下载用的url
     */
    public var imageUrl : String?
    
    /**
     *  定义闭包属性,可选类型
     */
    public  var ljcallBackClosure : OpreationClosure?
    
    func initWitParamter(_ url: String, _ callback: @escaping OpreationClosure) -> LJOpreationManager {
        
        if url != ""
        {
            self.imageUrl = url
            self.ljcallBackClosure = callback
        }
        return self
    }
    
    //MARK: -- start
    override func start() {
        
        print("start ljManager method")
        self.startRequest()
    }
    
    func startRequest()
    {
        //1、创建URL下载地址
        let url:URL! = URL(string:self.imageUrl!);
        
        //2、创建Request对象
        var urlRequest:URLRequest = URLRequest(url:url);
        urlRequest.httpMethod = "GET"
        urlRequest.httpShouldUsePipelining = true;
        
        //不需要缓存
        //urlRequest.cachePolicy = .reloadIgnoringLocalCacheData
        
        //3、创建会话
        let config = URLSessionConfiguration.default
        let session  = URLSession(configuration: config, delegate:self, delegateQueue: .main)
        
        //4、下载任务
        //2>-- -- 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
        }
    }
}

// MARK -  URLSessionDataDelegate 模式获取数据
extension LJOpreationManager: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("URLSessionDataDelegate----下载进度:------\(proValu*100)%");
    }
    
    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    {
        if ljcallBackClosure != nil ,let data = self.responseData{
            
            weak var weakSelf : LJOpreationManager? = self
            DispatchQueue.main.async
                {
                    print("URLSessionDataDelegate----数据下载完毕")
                    //将接收的数据结果回调到前台,用于进度展示
                    weakSelf?.ljcallBackClosure!(data as Data ,nil)
            }
        }
    }
}


2. 基于OprationQueue封装的网络数据管理组件
import Foundation

class LJWebImageManager: NSObject {
    
    /// Shared manager used .
    public static let shared = LJWebImageManager()
    public var ljquee  =  OperationQueue()
    
    override init() {
        if #available(iOS 8.0, *) {
            self.ljquee.qualityOfService = .background
        } else {
        }
    }
    
   public func requestByUrl(_ url: String,_ callback: @escaping OpreationClosure) -> LJOpreationManager {
        let operation = LJOpreationManager().initWitParamter(url, callback)
        ljquee.addOperation(operation)
        
        return operation
    }
}

3. 此处下载一张图片

    func setCellData(_ labelNameStr:String,  imageUrlStr:String)
    {
        titleLabel.text = labelNameStr as String
        /* Session 的delegate模式下载图片或者数据*/
        _ = LJWebImageManager.shared.requestByUrl(imageUrlStr, { (data, error) in
            
            if error == nil, data != nil {
                let newImage = UIImage(data: data! as Data)
                
                DispatchQueue.main.async{
                    let  titleImage = UIImageView(frame: CGRect(x: 0, y: 5, width: 40, height: 40))
                    titleImage.image = newImage
                    self.contentView.addSubview(titleImage)
                }
            }
            else
            {
                print(error ?? "")
            }
        })
    }


. . .

相关推荐

额外说明

mysq的 sql优化

  常查询字段的加索引 JOIN表时,要用相当类型字段,就算都是string,也要注意两个表字符集是不是一样 不要使用 order by rand()随机排序,耗CPU 避免使用select *  ,但oracle在后面版本上优化。oracle可以用。 

额外说明

数据结构图的深度遍历

数据结构 图的深度遍历 这篇是我补发的一篇文章,是大二上半学期得一次练习,把它发出来也是为了更好保存同时希望帮助到更多人! #include <stdio.h> #include <stdlib.h> #define MAXVEX 100 //最大顶点数

额外说明

成功解决了使用Clickhouse-JDBC-Bridge连接时区差8小时的Oracle日期类型的问题。

参考文章 https://blog.csdn.net/weixin_46359306/article/details/125045252 https://blog.csdn.net/weixin_46359306/article/details/1251

额外说明

内存和主板不兼容导致偶尔蓝屏,检查日志

右键windows徽标,事件查看器,刷选当前日志,1001 日志文件目录 除了不定时蓝屏,在暴风影音打开文件时有时出现

额外说明

关闭win10自动更新

参看资料来源:CSDN-解决win10烦人的自动更新

额外说明

使用GDIView工具排查GDI对象泄漏导致程序UI界面绘制异常的问题

目录 1、问题说明 2、初步分析 3、查看任务管理器,并使用GDIView工具分析

额外说明

SpringSecurity框架|荣耀磨练

-作者简介:练习时长两年半的Java up主 -个人主页:程序员老茶 - ps:点赞-是免费的,却可以让写博客的作者开兴好久好久- -系列专栏:Java全栈,计算机系列(火速更新中) - 格言:种一棵树最好的时间是十年前,其次是现在 -动动小手,点个关注

额外说明

java日期互转:LocalDateTime、String、TimeStamp、Long、Instant、Date

java日期互转:LocalDateTime、String、TimeStamp、Long、Instant、Date 由于java版本的迭代,一个使用java开发的项目中可能出现多种日期对象,例如LocalDateTime、LocalDate、Date,各

额外说明

ROS从入门到精通6-1:图文详解代价地图costmap原理与配置

目录 0 专栏介绍 1 地图服务 1.1 地图保存节点 1.2 地图服务节点 1.3 地图编辑 2 代价地图 2.1 基本概念 2.2 代价定义 3 Costmap配置 3.1 通用配置 3.2 局部配置 3.3 全局配置 0 专栏介绍 本专栏旨在通过对

额外说明

【C 程序设计】学习导论:C 语言简介、C 知识点思维导图

目录 一、C 语言思维导图 (1)数据类型  (2)运算  (3)控制结构  (4)过程式,模块化程序设计  (5)输入输出  (6)编码规范  (7)问题求解 二、C 语言的标准库 三、C 语言的编译过程  四、C 语言标准  五、C 语言的特点 六、

ads via 小工具