框架结构 URLSessionConfiguration 框架结构 SessionManager+ default: SessionManager+ defaultHTTPHeaders: HTTPHeaders+ multipartFormDataEncodingMemoryThreshold: UInt64- session: URLSession- delegate: SessionDelegate- startRequestsImmediately: Bool- adapter: RequestAdapter?- retrier: RequestRetrier?- backgroundCompletionHandler: (() -> Void)?- queue: DispatchQueue+ init(configuration: delegate: serverTrustPolicyManager:)+ init?(session: delegate: serverTrustPolicyManager:)+ deinit- request(_ url: ) -> DataRequest- download(_ url: ) -> DownloadRequest- upload(_ fileURL: ) -> UploadRequesttypealias HTTPHeaders = [String: String]set and get to/from delegate.retrierinit URLSession and set delegatesession.invalidateAndCancel()URLSession- serverTrustPolicyManager: ServerTrustPolicyManager- delegate: URLSessionDelegate?SessionDelegate- retrier: RequestRetrier?- subscript(task: URLSessionTask) -> Request?Ex URLSessionDelegateEx URLSessionTaskDelegateEx URLSessionDataDelegateEx URLSessionDownloadDelegateEx URLSessionStreamDelegateRequest- session: URLSession- delegate:TaskDelegate- retryCount:UInt+ init(session: requestTask: error:)- resume()- suspend()- cancel()creat URLSessionTask and RequestURLSession SessionDelegateRequest 循环引用,当task完成后SessionDelegate根据task移除包含的Request,从而释放RequestTaskDelegate- queue: OperationQueue- data: Data?- error: Error?- task: URLSessionTask?EX URLSessionTaskDelegateEX URLSessionDataDelegateEX URLSessionDownloadDelegate在queue中添加操作,序列化reques中的数据该queue创建的时候,isSuspended = true当task操作完成后,isSuspended = false从而执行序列化方法,进而执行completionHandler调用 response(queue: , completionHandler: ) 序列化 data流程图SesssionManager.defaultDownloadRequestdownload()URLRequesturl+method+parametes+encoding+headerURLSessionRequestAdapter++URLSessionDownloadTask调用 DownloadRequest初始化方法Data Result<Any> HTTPURLResponse Error调用 response(queue: , completionHandler: ) 序列化 datatask resum执行 SessionManager 的 SessionDelegate 和 Request 的 TaskDelegatetask finish 开始序列化URLSessionURLSessionTaskURLSessionConfigurationURLSessionDelegateURLSessionStreamTaskURLSessionDownloadTaskURLSessionDataTaskURLSessionUploadTaskURLSessionDataDelegateURLSessionDownloadDelegateURLSessionTaskDelegateURLSessionStreamDelegateURLSession 框架 URLSessionConfiguration URLSession 在初始化时会把配置它的 URLSessionConfiguration 对象进行一次 copy,并保存到自己的 configuration 属性中,而且这个属性是只读的。因此之后再修改最初配置 session 的那个 configuration 对象对于 session 是没有影响的。也就是说,configuration 只在初始化时被读取一次,之后都是不会变化的。