前面写过一篇swift 网络----利用URLSession的Block模式下载多张图片,主要界面的cell同上,本篇直接贴URLSession的delegate模式下封装好的网络库代码。
下载类
import Foundation
import UIKit
//定义一个传图片数据的闭包
public typealias SwiftClosure = ((_ data:Data?,_ 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
//3、创建会话
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config,delegate:self,delegateQueue: nil)
//4、下载任务
let downloadTask = session.downloadTask(with: urlRequest)
//5、启动任务
downloadTask.resume()
}
//初始化一个data,用来存储下载下来的数据
private var _responseData: NSMutableData!
var responseData: NSMutableData!{
get{
if _responseData == nil {
_responseData = NSMutableData()
}
return _responseData
}
set{
self._responseData = newValue
}
}
}
// MARK - URLSessionDownloadDelegate
extension LJSessionRequestManager:URLSessionDownloadDelegate{
//下载进度
func urlSession(_ session: URLSession,downloadTask: URLSessionDownloadTask,didWriteData bytesWritten: Int64,totalBytesWritten: Int64,totalBytesExpectedToWrite: Int64) {
//获取进度
let written:CGFloat = CGFloat(bytesWritten)
let total:CGFloat = CGFloat(totalBytesWritten)
let pro:CGFloat = written/total
print("----下载进度:------\(pro)");
}
//下载偏移
func urlSession(_ session: URLSession,didResumeAtOffset fileOffset: Int64,expectedTotalBytes: Int64) {
//主要用于暂停续传
}
//下载结束
func urlSession(_ session: URLSession,didFinishDownloadingTo location: URL) {
//根据下载存储的location位置来获取data数据
let data = (try? Data(contentsOf: URL(fileURLWithPath: location.path)))
if callBackClosure != nil,let data = data{
callBackClosure!(data,nil)
}
/* 保存到相册
UIImage * image = [UIImage imageWithData:data];
UIImageWritetoSavedPhotosAlbum(image,nil,nil);
*/
}
public func urlSession(_ session: URLSession,task: URLSessionTask,didCompleteWithError error: Error?)
{
if error != nil {
callBackClosure!(nil,error)
}
}
}
使用
/* 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截图