بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
دانلود در Swift 3 (کلاس مورد استفاده در آموزش ها)
با سلام
همون جور که میدونید سویفت ۳ دارای یک سری تغییرات بوده و آموزش ها هم از این قاعده مستثنی نیستن . از اون جا که دانلود جزو بخش های پر کاربرد هست و مورد نیاز خیلی از کاربران میشه، برای جلوگیری از استفاده از کتابخونه های جانبی، همون کلاس دانلود منیجر رو با سویفت ۳ اینجا قرار میدم تا دوستان، درگیر تغییرات نشن .
import Foundation
class DownloadManager:NSObject, URLSessionDownloadDelegate {
private static var downloadList:[String] = []
private var fileUrl:String!
private var savePath:String!
private var saveName:String!
private var onDownloadComplete:((_ url:String,_ filePath:String) -> Void)?
private var onProgressChange:((_ percent:Int,_ downloadedSize:Float,_ fileSize:Float) -> Void)?
private var onDownloadFailed:((_ url:String,_ error:Error) -> Void)?
internal func fileUrl(value:String) -> DownloadManager {
fileUrl = value
return self
}
internal func savePath(value:String) -> DownloadManager {
savePath = value
return self
}
internal func saveName(value:String) -> DownloadManager {
saveName = value
return self
}
internal func onDownloadComplete(value:@escaping (_ url:String,_ filePath:String) -> Void) -> DownloadManager {
onDownloadComplete = value
return self
}
internal func onProgressChange(value:@escaping (_ percent:Int,_ downloadedSize:Float,_ fileSize:Float) -> Void) -> DownloadManager {
onProgressChange = value
return self
}
internal func onDownloadFailed(value:@escaping (_ url:String, _ error:Error) -> Void) -> DownloadManager {
onDownloadFailed = value
return self
}
internal func download(){
if saveName == nil {
saveName = DownloadManager.getFilename(url: fileUrl)
}
if savePath == nil {
savePath = AppDelegate.downloadPath
}
let fileManager = FileManager.default
if fileManager.fileExists(atPath: getFilePath()) {
if self.onDownloadComplete != nil {
self.onDownloadComplete!(self.fileUrl, getFilePath())
}
return
}
if DownloadManager.downloadList.contains(fileUrl) {
return
}
DownloadManager.downloadList.append(fileUrl)
let mainQueue = OperationQueue.main
let sessionConf = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConf, delegate: self, delegateQueue: mainQueue)
let nsUrl = URL(string: fileUrl)
let request = URLRequest(url: nsUrl!)
let downloadTask = session.downloadTask(with: request)
downloadTask.resume()
}
internal func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
let downloadedSize = Float(totalBytesWritten)
let fileSize = Float(totalBytesExpectedToWrite)
let percent = Int((downloadedSize / fileSize) * 100)
if onProgressChange != nil {
onProgressChange!(percent, downloadedSize, fileSize)
}
}
internal func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
let fileManager = FileManager.default
do {
let content = try Data(contentsOf: location)
fileManager.createFile(atPath: getFilePath(), contents: content, attributes: nil)
} catch {
print(error.localizedDescription)
}
if onDownloadComplete != nil {
onDownloadComplete!(self.fileUrl, getFilePath())
}
}
internal func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
if error != nil {
if onDownloadFailed != nil {
onDownloadFailed!(fileUrl, error!)
}
}
}
internal static func byteToSize(bytes:Float) -> String {
if bytes == 0 {
return "0 Byte"
}
let kb:Float = 1024
let sizeList = ["Bytes", "KB", "MB", "GB", "TB"]
let i = floor(log(bytes) / log(kb));
let fileSize = Float((bytes / pow(kb, i)))
return String(format: "%0.2f", fileSize) + " " + sizeList[Int(i)];
}
private func getFilePath() -> String {
let filePath = savePath! + "/" + saveName!
return filePath
}
internal static func getFilename(url:String) -> String {
return url.components(separatedBy: "/").last!
}
}
موفق باشید./
برای این سوال پاسخی وجود ندارد.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .