@@ -10,6 +10,9 @@ open class Session {
10
10
/// The default callback queue for `send(_:handler:)`.
11
11
public let callbackQueue : CallbackQueue
12
12
13
+ /// Closure type executed when the upload or download progress of a request.
14
+ public typealias ProgressHandler = ( Progress ) -> Void
15
+
13
16
/// Returns `Session` instance that is initialized with `adapter`.
14
17
/// - parameter adapter: The adapter that connects lower level backend with Session interface.
15
18
/// - parameter callbackQueue: The default callback queue for `send(_:handler:)`.
@@ -33,11 +36,13 @@ open class Session {
33
36
/// Calls `send(_:callbackQueue:handler:)` of `Session.shared`.
34
37
/// - parameter request: The request to be sent.
35
38
/// - 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.
37
42
/// - returns: The new session task.
38
43
@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)
41
46
}
42
47
43
48
/// Calls `cancelRequests(with:passingTest:)` of `Session.shared`.
@@ -51,11 +56,13 @@ open class Session {
51
56
/// `Request.Response` is inferred from `Request` type parameter, the it changes depending on the request type.
52
57
/// - parameter request: The request to be sent.
53
58
/// - 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.
55
62
/// - returns: The new session task.
56
63
@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)
59
66
task? . resume ( )
60
67
return task
61
68
}
@@ -77,7 +84,7 @@ open class Session {
77
84
}
78
85
}
79
86
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 ? {
81
88
let callbackQueue = callbackQueue ?? self . callbackQueue
82
89
let urlRequest : URLRequest
83
90
do {
@@ -90,8 +97,15 @@ open class Session {
90
97
}
91
98
92
99
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
+ }
95
109
} ,
96
110
completionHandler: { data, urlResponse, error in
97
111
let result : Result < Request . Response , SessionTaskError >
0 commit comments