@@ -10,6 +10,9 @@ open class Session {
1010 /// The default callback queue for `send(_:handler:)`.
1111 public let callbackQueue : CallbackQueue
1212
13+ /// Closure type executed when the upload or download progress of a request.
14+ public typealias ProgressHandler = ( Progress ) -> Void
15+
1316 /// Returns `Session` instance that is initialized with `adapter`.
1417 /// - parameter adapter: The adapter that connects lower level backend with Session interface.
1518 /// - parameter callbackQueue: The default callback queue for `send(_:handler:)`.
@@ -33,11 +36,13 @@ open class Session {
3336 /// Calls `send(_:callbackQueue:handler:)` of `Session.shared`.
3437 /// - parameter request: The request to be sent.
3538 /// - parameter callbackQueue: The queue where the handler runs. If this parameters is `nil`, default `callbackQueue` of `Session` will be used.
36- /// - parameter handler: The closure that receives result of the request.
39+ /// - parameter uploadProgressHandler: The closure that receives upload progress of the request.
40+ /// - parameter downloadProgressHandler: The closure that receives download progress of the request.
41+ /// - parameter completionHandler: The closure that receives result of the request.
3742 /// - returns: The new session task.
3843 @discardableResult
39- open class func send< Request: APIKit . Request > ( _ request: Request , callbackQueue: CallbackQueue ? = nil , progressHandler : @escaping ( Progress ) -> Void = { _ in } , completionHandler: @escaping ( Result < Request . Response , SessionTaskError > ) -> Void = { _ in } ) -> SessionTask ? {
40- return shared. send ( request, callbackQueue: callbackQueue, progressHandler : progressHandler , completionHandler: completionHandler)
44+ open class func send< Request: APIKit . Request > ( _ request: Request , callbackQueue: CallbackQueue ? = nil , uploadProgressHandler : @escaping ProgressHandler = { _ in } , downloadProgressHandler : @escaping ProgressHandler = { _ in } , completionHandler: @escaping ( Result < Request . Response , SessionTaskError > ) -> Void = { _ in } ) -> SessionTask ? {
45+ return shared. send ( request, callbackQueue: callbackQueue, uploadProgressHandler : uploadProgressHandler , downloadProgressHandler : downloadProgressHandler , completionHandler: completionHandler)
4146 }
4247
4348 /// Calls `cancelRequests(with:passingTest:)` of `Session.shared`.
@@ -51,11 +56,13 @@ open class Session {
5156 /// `Request.Response` is inferred from `Request` type parameter, the it changes depending on the request type.
5257 /// - parameter request: The request to be sent.
5358 /// - parameter callbackQueue: The queue where the handler runs. If this parameters is `nil`, default `callbackQueue` of `Session` will be used.
54- /// - parameter handler: The closure that receives result of the request.
59+ /// - parameter uploadProgressHandler: The closure that receives upload progress of the request.
60+ /// - parameter downloadProgressHandler: The closure that receives download progress of the request.
61+ /// - parameter completionHandler: The closure that receives result of the request.
5562 /// - returns: The new session task.
5663 @discardableResult
57- open func send< Request: APIKit . Request > ( _ request: Request , callbackQueue: CallbackQueue ? = nil , progressHandler : @escaping ( Progress ) -> Void = { _ in } , completionHandler: @escaping ( Result < Request . Response , SessionTaskError > ) -> Void = { _ in } ) -> SessionTask ? {
58- let task = createSessionTask ( request, callbackQueue: callbackQueue, progressHandler : progressHandler , completionHandler: completionHandler)
64+ open func send< Request: APIKit . Request > ( _ request: Request , callbackQueue: CallbackQueue ? = nil , uploadProgressHandler : @escaping ProgressHandler = { _ in } , downloadProgressHandler : @escaping ProgressHandler = { _ in } , completionHandler: @escaping ( Result < Request . Response , SessionTaskError > ) -> Void = { _ in } ) -> SessionTask ? {
65+ let task = createSessionTask ( request, callbackQueue: callbackQueue, uploadProgressHandler : uploadProgressHandler , downloadProgressHandler : downloadProgressHandler , completionHandler: completionHandler)
5966 task? . resume ( )
6067 return task
6168 }
@@ -77,7 +84,7 @@ open class Session {
7784 }
7885 }
7986
80- internal func createSessionTask< Request: APIKit . Request > ( _ request: Request , callbackQueue: CallbackQueue ? , progressHandler : @escaping ( Progress ) -> Void , completionHandler: @escaping ( Result < Request . Response , SessionTaskError > ) -> Void ) -> SessionTask ? {
87+ internal func createSessionTask< Request: APIKit . Request > ( _ request: Request , callbackQueue: CallbackQueue ? , uploadProgressHandler : @escaping ProgressHandler , downloadProgressHandler : @escaping ProgressHandler , completionHandler: @escaping ( Result < Request . Response , SessionTaskError > ) -> Void ) -> SessionTask ? {
8188 let callbackQueue = callbackQueue ?? self . callbackQueue
8289 let urlRequest : URLRequest
8390 do {
@@ -90,8 +97,15 @@ open class Session {
9097 }
9198
9299 let task = adapter. createTask ( with: urlRequest,
93- progressHandler: { progress in
94- progressHandler ( progress)
100+ uploadProgressHandler: { progress in
101+ callbackQueue. execute {
102+ uploadProgressHandler ( progress)
103+ }
104+ } ,
105+ downloadProgressHandler: { progress in
106+ callbackQueue. execute {
107+ downloadProgressHandler ( progress)
108+ }
95109 } ,
96110 completionHandler: { data, urlResponse, error in
97111 let result : Result < Request . Response , SessionTaskError >
0 commit comments