@@ -6,88 +6,6 @@ import LlamaKit
6
6
7
7
public let APIKitErrorDomain = " APIKitErrorDomain "
8
8
9
- public protocol Request {
10
- typealias Response: Any
11
-
12
- var URLRequest : NSURLRequest ? { get }
13
-
14
- func responseFromObject( object: AnyObject ) -> Response ?
15
- }
16
-
17
- public enum Method : String {
18
- case GET = " GET "
19
- case POST = " POST "
20
- case PUT = " PUT "
21
- case HEAD = " HEAD "
22
- case DELETE = " DELETE "
23
- case PATCH = " PATCH "
24
- case TRACE = " TRACE "
25
- case OPTIONS = " OPTIONS "
26
- case CONNECT = " CONNECT "
27
- }
28
-
29
- private var taskRequestKey = 0
30
- private var dataTaskResponseBufferKey = 0
31
- private var dataTaskCompletionHandlerKey = 0
32
-
33
- private extension NSURLSessionDataTask {
34
- // `var request: Request?` is not available in both of Swift 1.1 and 1.2
35
- // ("protocol can only be used as a generic constraint")
36
- private var request : Any ? {
37
- get {
38
- return ( objc_getAssociatedObject ( self , & taskRequestKey) as? Box < Any > ) ? . unbox
39
- }
40
-
41
- set {
42
- if let value = newValue {
43
- objc_setAssociatedObject ( self , & taskRequestKey, Box ( value) , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
44
- } else {
45
- objc_setAssociatedObject ( self , & taskRequestKey, nil , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
46
- }
47
- }
48
- }
49
-
50
- private var responseBuffer : NSMutableData {
51
- if let responseBuffer = objc_getAssociatedObject ( self , & dataTaskResponseBufferKey) as? NSMutableData {
52
- return responseBuffer
53
- } else {
54
- let responseBuffer = NSMutableData ( )
55
- objc_setAssociatedObject ( self , & dataTaskResponseBufferKey, responseBuffer, UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
56
- return responseBuffer
57
- }
58
- }
59
-
60
- private var completionHandler : ( ( NSData , NSURLResponse ? , NSError ? ) -> Void ) ? {
61
- get {
62
- return ( objc_getAssociatedObject ( self , & dataTaskCompletionHandlerKey) as? Box < ( NSData , NSURLResponse ? , NSError ? ) -> Void > ) ? . unbox
63
- }
64
-
65
- set {
66
- if let value = newValue {
67
- objc_setAssociatedObject ( self , & dataTaskCompletionHandlerKey, Box ( value) , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
68
- } else {
69
- objc_setAssociatedObject ( self , & dataTaskCompletionHandlerKey, nil , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
70
- }
71
- }
72
- }
73
- }
74
-
75
- extension NSURLSessionDownloadTask {
76
- private var request : Any ? {
77
- get {
78
- return ( objc_getAssociatedObject ( self , & taskRequestKey) as? Box < Any > ) ? . unbox
79
- }
80
-
81
- set {
82
- if let value = newValue {
83
- objc_setAssociatedObject ( self , & taskRequestKey, Box ( value) , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
84
- } else {
85
- objc_setAssociatedObject ( self , & taskRequestKey, nil , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
86
- }
87
- }
88
- }
89
- }
90
-
91
9
// use private, global scope variable until we can use stored class var in Swift 1.2
92
10
private let internalDefaultURLSession = NSURLSession (
93
11
configuration: NSURLSessionConfiguration . defaultSessionConfiguration ( ) ,
@@ -249,15 +167,16 @@ public class API {
249
167
}
250
168
}
251
169
170
+ // MARK: - default implementation of URLSessionDelegate
252
171
public class URLSessionDelegate : NSObject , NSURLSessionDelegate , NSURLSessionDataDelegate {
253
- // MARK: - NSURLSessionTaskDelegate
172
+ // MARK: NSURLSessionTaskDelegate
254
173
public func URLSession( session: NSURLSession , task: NSURLSessionTask , didCompleteWithError connectionError: NSError ? ) {
255
174
if let dataTask = task as? NSURLSessionDataTask {
256
175
dataTask. completionHandler ? ( dataTask. responseBuffer, dataTask. response, connectionError)
257
176
}
258
177
}
259
178
260
- // MARK: - NSURLSessionDataDelegate
179
+ // MARK: NSURLSessionDataDelegate
261
180
public func URLSession( session: NSURLSession , dataTask: NSURLSessionDataTask , didReceiveData data: NSData ) {
262
181
dataTask. responseBuffer. appendData ( data)
263
182
}
@@ -266,3 +185,67 @@ public class URLSessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionDat
266
185
downloadTask. request = dataTask. request
267
186
}
268
187
}
188
+
189
+ // MARK: - NSURLSessionTask extensions
190
+ private var taskRequestKey = 0
191
+ private var dataTaskResponseBufferKey = 0
192
+ private var dataTaskCompletionHandlerKey = 0
193
+
194
+ private extension NSURLSessionDataTask {
195
+ // `var request: Request?` is not available in both of Swift 1.1 and 1.2
196
+ // ("protocol can only be used as a generic constraint")
197
+ private var request : Any ? {
198
+ get {
199
+ return ( objc_getAssociatedObject ( self , & taskRequestKey) as? Box < Any > ) ? . unbox
200
+ }
201
+
202
+ set {
203
+ if let value = newValue {
204
+ objc_setAssociatedObject ( self , & taskRequestKey, Box ( value) , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
205
+ } else {
206
+ objc_setAssociatedObject ( self , & taskRequestKey, nil , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
207
+ }
208
+ }
209
+ }
210
+
211
+ private var responseBuffer : NSMutableData {
212
+ if let responseBuffer = objc_getAssociatedObject ( self , & dataTaskResponseBufferKey) as? NSMutableData {
213
+ return responseBuffer
214
+ } else {
215
+ let responseBuffer = NSMutableData ( )
216
+ objc_setAssociatedObject ( self , & dataTaskResponseBufferKey, responseBuffer, UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
217
+ return responseBuffer
218
+ }
219
+ }
220
+
221
+ private var completionHandler : ( ( NSData , NSURLResponse ? , NSError ? ) -> Void ) ? {
222
+ get {
223
+ return ( objc_getAssociatedObject ( self , & dataTaskCompletionHandlerKey) as? Box < ( NSData , NSURLResponse ? , NSError ? ) -> Void > ) ? . unbox
224
+ }
225
+
226
+ set {
227
+ if let value = newValue {
228
+ objc_setAssociatedObject ( self , & dataTaskCompletionHandlerKey, Box ( value) , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
229
+ } else {
230
+ objc_setAssociatedObject ( self , & dataTaskCompletionHandlerKey, nil , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
231
+ }
232
+ }
233
+ }
234
+ }
235
+
236
+ extension NSURLSessionDownloadTask {
237
+ private var request : Any ? {
238
+ get {
239
+ return ( objc_getAssociatedObject ( self , & taskRequestKey) as? Box < Any > ) ? . unbox
240
+ }
241
+
242
+ set {
243
+ if let value = newValue {
244
+ objc_setAssociatedObject ( self , & taskRequestKey, Box ( value) , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
245
+ } else {
246
+ objc_setAssociatedObject ( self , & taskRequestKey, nil , UInt ( OBJC_ASSOCIATION_RETAIN_NONATOMIC) )
247
+ }
248
+ }
249
+ }
250
+ }
251
+
0 commit comments