上一篇有略讲
URLSession
处理后台下载 Alamofire(一)
这一篇来研究下Alamofire
- 后台下载
接下来进入正题
//封装了一层单例 - 后台下载管理类(在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
的回调方便直接接收