您的位置:首页 > 理论基础 > 计算机网络

swift 利用Opration和OprationQueue来下载网络图片

2017-07-08 21:55 246 查看
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 ?? "")
}
})
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: