آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

دانلود در Swift 3 (کلاس مورد استفاده در آموزش ها)

صادقی راد  7 سال پیش  7 سال پیش
+3 0

با سلام

همون جور که میدونید سویفت ۳ دارای یک سری تغییرات بوده و آموزش ها هم از این قاعده مستثنی نیستن . از اون جا که دانلود جزو بخش های پر کاربرد هست و مورد نیاز خیلی از کاربران میشه، برای جلوگیری از استفاده از کتابخونه های جانبی، همون کلاس دانلود منیجر رو با سویفت ۳ اینجا قرار میدم تا دوستان، درگیر تغییرات نشن .

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!
    }
    
}

موفق باشید./

 برای این سوال پاسخی وجود ندارد.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .