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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值