详解Swift 利用Opration和OprationQueue来下载网络图片

详解Swift 利用Opration和OprationQueue来下载网络图片

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 ?? "")
    }
  })
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • swift3.0实现图片放大缩小动画效果

    一. 内容说明 跟我之前这篇类似,只不过那篇是OC版本,这篇是Swift版本 OC版本链接地址 目的:通过kingfisher请求5张图片,展示出来.然后利用图片放大缩小管理类展示图片,多张图片可以滑动浏览 效果图如下,想看动态的效果图,请看上面链接中的OC版本效果图,跟这篇是一样的. 本demo,只加载本地图片的demo下载链接 ,需要加载网络图片的,需要下载Kingfisher 二.源码展示 0. 图片测试demo源码 import Foundation import UIKit class

  • 详解Swift 利用Opration和OprationQueue来下载网络图片

    详解Swift 利用Opration和OprationQueue来下载网络图片 1. 基于Opration封装的获取网络数据组件 import Foundation import UIKit public typealias OpreationClosure = ((_ data:Data? , _ error: Error?) -> Void) class LJOpreationManager: Operation { /** * 下载用的url */ public var imageUrl

  • 详解Swift model 解析的两种方法

    详解Swift model 解析的两种方法 1. 常规解析方法 //懒加载声明一个LJNewsModel为数据的数组 lazy var ljArray : [LJNewsModel] = [LJNewsModel]() //MARK:-- 数据获取和解析 extension NewsViewController{ func requestNetData(){ /* 打印json数据 */ LJDownLoadNetImage.request("GET", url: "http

  • 详解IOS 利用storyboard修改UITextField的placeholder文字颜色

    详解IOS 利用storyboard修改UITextField的placeholder文字颜色 最近有个需求需要修改UITextField的placeholder文字颜色,在网上找发现有用代码修改的,但是考虑到更加优雅的实现,所以尝试着在storyboard中直接实现,结果竟然真的成功了, 实现的位置如下: 具体步骤: 1.在User Defined Runtime Attributes中添加一个Key. 2.输入Key Path(这里我们输入_placeholderLabel.textColo

  • 详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法

    详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法 由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与UnsafeMutablePointer类型,分别对应为const Type*类型与Type *类型. 而在Swift编程语言中,由于一般数组(Array)对象都无法直接用于C语言中含有指针类型的函数参数(比如:void*),所以往往需要

  • 详解Swift 结构体

    Swift 结构体是构建代码所用的一种通用且灵活的构造体. 我们可以为结构体定义属性(常量.变量)和添加方法,从而扩展结构体的功能. 与 C 和 Objective C 不同的是: 结构体不需要包含实现文件和接口. 结构体允许我们创建一个单一文件,且系统会自动生成面向其它代码的外部接口. 结构体总是通过被复制的方式在代码中传递,因此它的值是不可修改的. 语法 我们通过关键字 struct 来定义结构体: struct nameStruct { Definition 1 Definition 2

  • 详解Python利用configparser对配置文件进行读写操作

    简介 想写一个登录注册的demo,但是以前的demo数据都写在程序里面,每一关掉程序数据就没保存住.. 于是想着写到配置文件里好了 Python自身提供了一个Module - configparser,来进行对配置文件的读写 Configuration file parser. A configuration file consists of sections, lead by a "[section]" header, and followed by "name: valu

  • 详解Swift的内存管理

    内存管理 和OC一样, 在Swift中也是采用基于引用计数的ARC内存管理方案(针对堆空间的内存管理) 在Swift的ARC中有三种引用 强引用(strong reference):默认情况下,代码中涉及到的引用都是强引用 弱引用(weak reference):通过weak定义弱引用 无主引用(unowned reference):通过unowned定义无主引用 weak 弱引用(weak reference):通过weak定义弱引用必须是可选类型的var,因为实例销毁后,ARC会自动将弱引用

  • 详解如何利用tushare、pycharm和excel三者结合进行股票分析

    前言 当你逐渐了解tushare之后,你会发现我们要进行数据分析只靠tushare是不够的,接下来我将介绍如何利用第三方软件将tushare获取的数据进行分析. 一.使用工具 首先我们需要下载pycharm,下载网址:https://www.jetbrains.com/pycharm/download/,同时准备两个Excel文件,一个用了存放获取的数据,另一个进行数据的引用与分析. 二.使用步骤 1.首先在pycharm的setting中下载三个包:numpy.tushare.matplotl

  • 详解Java利用深度优先遍历解决迷宫问题

    目录 什么是深度优先 一个简单的例子 程序实现 什么是深度优先 什么是深度,即向下,深度优先,即向下优先,一口气走到底,走到底发现没路再往回走. 在算法实现上来讲,深度优先可以考虑是递归的代名词,深度优先搜索必然需要使用到递归的思路. 有的人可能会说了,我可以用栈来实现,以迭代的方式,那么问题来了,栈这种数据结构,同学们认为是否也囊括了递归呢?Java语言的方法区本身也是实现在一个栈空间上的. 一个简单的例子 我们以一个简单的迷宫为例,以1代表墙,0代表路径,我们构造一个具有出入口的迷宫. 1

  • 详解如何利用Python绘制迷宫小游戏

    目录 构思 绘制迷宫 走出迷宫 完整代码 更大的挑战 关于坐标系设置 周末在家,儿子闹着要玩游戏,让玩吧,不利于健康,不让玩吧,扛不住他折腾,于是想,不如一起搞个小游戏玩玩! 之前给他编过猜数字 和 掷骰子 游戏,现在已经没有吸引力了,就对他说:“我们来玩个迷宫游戏吧.” 果不其然,有了兴趣,于是和他一起设计实现起来,现在一起看看我们是怎么做的吧,说不定也能成为一个陪娃神器~ 先一睹为快: 构思 迷宫游戏,相对比较简单,设置好地图,然后用递归算法来寻找出口,并将过程显示出来,增强趣味性. 不如想

随机推荐