Alamofire - 后台下载

上一篇有略讲URLSession处理后台下载 Alamofire(一)

这一篇来研究下Alamofire - 后台下载

configuration - init 源码

commonInit - 源码
接下来进入正题
//封装了一层单例 - 后台下载管理类(在GitHub上查找的资料某位大神提供)
struct LGBackgroundManger {
    
    static let shared = LGBackgroundManger()
    
    let manager: SessionManager = {
        let configuration = URLSessionConfiguration.background(withIdentifier: "com.lgcooci.AlamofireTest.demo")
        configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
//        configuration.timeoutIntervalForRequest = 10
//        configuration.timeoutIntervalForResource = 10
//        configuration.sharedContainerIdentifier = "group.com.lgcooci.AlamofireTest"
        
        return SessionManager(configuration: configuration)
    }()
}

        // 链式请求 -- 本质调用函数方法的时候不断的返回对象、这个对象又可以不断调用下层函数方法 
        LGBackgroundManger.shared.manager
            .download(self.urlDownloadStr1) { (url, response) -> (destinationURL: URL, options: DownloadRequest.DownloadOptions) in
                let documentUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
                let fileUrl     = documentUrl?.appendingPathComponent(response.suggestedFilename!)
                //返回元祖
                return (fileUrl!,[.removePreviousFile,.createIntermediateDirectories])
            }
            .response { (downloadResponse) in
                print("下载回调信息: \(downloadResponse)")
            }
            .downloadProgress { (progress) in
                print("下载进度 : \(progress)")
            }

// 后台进行载完成 -- 进行刷新主线程【AppDelegate】
    func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
        print("hello - \(identifier)")
       LGBackgroundManger.shared.manager.backgroundCompletionHandler = completionHandler
    }

为什么要做成单例,URLSession的时候不是挺好的?

  • 如果你是SessionManager.defalut 显然是不可以的!毕竟要求后台下载,那么我们的会话session的配置
  • URLSessionConfiguration是要求background模式的
    如果你配置出来不做成单例,或者不被持有!在进入后台就会释放,网络也就会报错:Error Domain=NSURLErrorDomain Code=-999 "cancelled"
  • 应用层与网络层也可以达到分离。
  • 能够帮助在AppDelegate 的回调方便直接接收

你可能感兴趣的:(Alamofire - 后台下载)