Skip to content

Commit 9376985

Browse files
committed
merged with errors branch
2 parents 0908d68 + 06bd5be commit 9376985

7 files changed

+97
-57
lines changed

Cartfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
github "Alamofire/Alamofire" "3.2.1"
2-
github "s4cha/Arrow" "2.0.1"
3-
github "s4cha/then" "685bb06571a1f390e8d48064303961cd64df9a19"
1+
github "Alamofire/Alamofire" "3.4.1"
2+
github "s4cha/Arrow" "2.0.2"
3+
github "s4cha/then" "1.4.0"

Cartfile.resolved

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
github "Alamofire/Alamofire" "3.2.1"
2-
github "s4cha/Arrow" "2.0.1"
3-
github "s4cha/then" "dc0053ff511f135ff6731dd851be4748a0c3dc56"
1+
github "Alamofire/Alamofire" "3.4.1"
2+
github "s4cha/Arrow" "2.0.2"
3+
github "s4cha/then" "1.4.0"

ws.framework.zip

-960 KB
Binary file not shown.

ws/WS+TypedCalls.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@ extension WS {
4040
let mapper = WSModelJSONParser<T>()
4141
let model = mapper.toModel(json)
4242
return model
43-
}
43+
}.resolveOnMainThread()
4444
}
4545
}

ws/WS.swift

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,63 +80,64 @@ public class WS {
8080
let mapper = WSModelJSONParser<T>()
8181
let models = mapper.toModels(json)
8282
return models
83-
}
83+
}.resolveOnMainThread()
8484
}
8585

86+
8687
//MARK JSON versions
8788

8889
public func get(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<JSON> {
89-
return getRequest(url, params: params).fetch()
90+
return getRequest(url, params: params).fetch().resolveOnMainThread()
9091
}
9192

9293
public func post(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<JSON> {
93-
return postRequest(url, params: params).fetch()
94+
return postRequest(url, params: params).fetch().resolveOnMainThread()
9495
}
9596

9697
public func put(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<JSON> {
97-
return putRequest(url, params: params).fetch()
98+
return putRequest(url, params: params).fetch().resolveOnMainThread()
9899
}
99100

100101
public func delete(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<JSON> {
101-
return deleteRequest(url, params: params).fetch()
102+
return deleteRequest(url, params: params).fetch().resolveOnMainThread()
102103
}
103104

104105
//MARK Void versions
105106

106107
public func get(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<Void> {
107108
let r = getRequest(url, params: params)
108109
r.returnsJSON = false
109-
return r.fetch().registerThen { (json: JSON) -> Void in }
110+
return r.fetch().registerThen { (json: JSON) -> Void in }.resolveOnMainThread()
110111
}
111112

112113
public func post(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<Void> {
113114
let r = postRequest(url, params: params)
114115
r.returnsJSON = false
115-
return r.fetch().registerThen { (json: JSON) -> Void in }
116+
return r.fetch().registerThen { (json:JSON) -> Void in }.resolveOnMainThread()
116117
}
117118

118119
public func put(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<Void> {
119120
let r = putRequest(url, params: params)
120121
r.returnsJSON = false
121-
return r.fetch().registerThen { (_: JSON) -> Void in }
122+
return r.fetch().registerThen { (_:JSON) -> Void in }.resolveOnMainThread()
122123
}
123124

124125
public func delete(url:String, params:[String:AnyObject] = [String:AnyObject]()) -> Promise<Void> {
125126
let r = deleteRequest(url, params: params)
126127
r.returnsJSON = false
127-
return r.fetch().registerThen { (_: JSON) -> Void in }
128+
return r.fetch().registerThen { (_: JSON) -> Void in }.resolveOnMainThread()
128129
}
129130

130131
//MARK: - Multipart
131132

132133
public func postMultipart(url:String, params:[String:AnyObject] = [String:AnyObject](), name:String, data:NSData, fileName:String, mimeType:String) -> Promise<JSON> {
133134
let r = postMultipartRequest(url, params:params, name:name, data: data, fileName: fileName, mimeType: mimeType)
134-
return r.fetch()
135+
return r.fetch().resolveOnMainThread()
135136
}
136137

137138
public func putMultipart(url:String, params:[String:AnyObject] = [String:AnyObject](), name:String, data:NSData, fileName:String, mimeType:String) -> Promise<JSON> {
138139
let r = putMultipartRequest(url, params:params, name:name, data: data, fileName: fileName, mimeType: mimeType)
139-
return r.fetch()
140+
return r.fetch().resolveOnMainThread()
140141
}
141142

142143
// Keep here for now for backwards compatibility
@@ -150,6 +151,30 @@ public class WS {
150151
let mapper = WSModelJSONParser<T>()
151152
let models = mapper.toModels(json)
152153
return models
154+
}.resolveOnMainThread()
155+
}
156+
}
157+
158+
159+
160+
161+
public extension Promise {
162+
163+
public func resolveOnMainThread() -> Promise<T> {
164+
return Promise<T> { resolve, reject, progress in
165+
self.progress{ p in
166+
progress(p)
167+
}
168+
self.registerThen { t in
169+
dispatch_async(dispatch_get_main_queue()) {
170+
resolve(t)
171+
}
172+
}
173+
self.onError { e in
174+
dispatch_async(dispatch_get_main_queue()) {
175+
reject(e)
176+
}
177+
}
153178
}
154179
}
155-
}
180+
}

ws/WSError.swift

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,18 @@
77
//
88

99
import Foundation
10+
import Arrow
1011

11-
public enum WSError:ErrorType {
12-
case DefaultError
13-
case NetworkError
14-
case UnauthorizedError
15-
case NotFoundError
12+
public enum WSErrorType:Int {
13+
case NetworkUnreachable = 0
14+
case Forbidden = 403
15+
case Unauthorized = 401
16+
case NotFound = 404
17+
case Unknown
18+
}
19+
20+
public struct WSError:ErrorType {
21+
public var httpStatusCode = 0
22+
public var type:WSErrorType = .Unknown
23+
public var jsonPayload:JSON?
1624
}

ws/WSRequest.swift

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public class WSRequest {
5151
for (key, value) in headers {
5252
r.setValue(value, forHTTPHeaderField: key)
5353
}
54-
if let t = self.timeout {
54+
if let t = timeout {
5555
r.timeoutInterval = t
5656
}
5757

@@ -70,23 +70,26 @@ public class WSRequest {
7070
/// Returns Promise containing response status code, headers and parsed JSON
7171
public func fetch() -> Promise<(Int, [NSObject : AnyObject], JSON)> {
7272
return Promise<(Int, [NSObject : AnyObject], JSON)> { resolve, reject, progress in
73-
if self.showsNetworkActivityIndicator {
74-
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
75-
}
76-
if self.logLevels != .None {
77-
print("\(self.httpVerb) \(self.URL)")
78-
print("params : \(self.params)")
73+
let bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
74+
dispatch_async(bgQueue) {
75+
if self.showsNetworkActivityIndicator {
76+
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
77+
}
78+
if self.logLevels != .None {
79+
print("\(self.httpVerb) \(self.URL)")
80+
print("params : \(self.params)")
81+
if self.isMultipart {
82+
print("\(self.multipartName): \(self.multipartMimeType) \(self.multipartFileName)")
83+
}
84+
}
7985
if self.isMultipart {
80-
print("\(self.multipartName): \(self.multipartMimeType) \(self.multipartFileName)")
86+
self.sendMultipartRequest(resolve, reject: reject, progress:progress)
87+
} else if !self.returnsJSON {
88+
self.sendRequest(resolve, reject: reject)
89+
} else {
90+
self.sendJSONRequest(resolve, reject: reject)
8191
}
8292
}
83-
if self.isMultipart {
84-
self.sendMultipartRequest(resolve, reject: reject, progress:progress)
85-
} else if !self.returnsJSON {
86-
self.sendRequest(resolve, reject: reject)
87-
} else {
88-
self.sendJSONRequest(resolve, reject: reject)
89-
}
9093
}
9194
}
9295

@@ -126,60 +129,64 @@ public class WSRequest {
126129

127130
func sendRequest(resolve:(result:(Int, [NSObject : AnyObject], JSON))-> Void, reject:(error: ErrorType) -> Void) {
128131
self.req = request(self.buildRequest())
129-
req?.validate().response(completionHandler: { req, response, data, error in
132+
let bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
133+
req?.validate().response(queue:bgQueue) { req, response, data, error in
130134
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
131135
self.printResponseStatusCodeIfNeeded(response)
132136
if error == nil {
133137
resolve(result:(response?.statusCode ?? 0, response?.allHeaderFields ?? [:], JSON(["":""])!))
134138
} else {
135-
self.rejectCallWithMatchingError(response, reject: reject)
139+
self.rejectCallWithMatchingError(response, data: data, reject: reject)
136140
}
137-
})
141+
}
138142
}
139143

140144
func sendJSONRequest(resolve:(result:(Int, [NSObject : AnyObject], JSON))-> Void, reject:(error: ErrorType) -> Void) {
141145
self.req = request(self.buildRequest())
142-
req?.validate().responseJSON { r in
146+
let bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
147+
req?.validate().responseJSON(queue: bgQueue) { r in
143148
self.handleJSONResponse(r, resolve: resolve, reject: reject)
144149
}
145150
}
146151

147152
func handleJSONResponse(response:Response<AnyObject, NSError>, resolve:(result:(Int, [NSObject : AnyObject], JSON))-> Void, reject:(error: ErrorType) -> Void) {
148153
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
149-
self.printResponseStatusCodeIfNeeded(response.response)
154+
printResponseStatusCodeIfNeeded(response.response)
150155
switch response.result {
151156
case .Success(let value):
152-
if self.logLevels == .CallsAndResponses {
157+
if logLevels == .CallsAndResponses {
153158
print(value)
154159
}
155160
if let json:JSON = JSON(value) {
156161
resolve(result: (response.response?.statusCode ?? 0, response.response?.allHeaderFields ?? [:], json))
157162
} else {
158-
self.rejectCallWithMatchingError(response.response, reject: reject)
163+
rejectCallWithMatchingError(response.response, reject: reject)
159164
}
160165
case .Failure(_):
161-
self.rejectCallWithMatchingError(response.response, reject: reject)
166+
rejectCallWithMatchingError(response.response, reject: reject)
162167
}
163168
}
164169

165170
func printResponseStatusCodeIfNeeded(response:NSHTTPURLResponse?) {
166-
if self.logLevels == .CallsAndResponses {
171+
if logLevels == .CallsAndResponses {
167172
if let sc = response?.statusCode {
168173
print("CODE: \(sc)")
169174
}
170175
}
171176
}
172177

173-
func rejectCallWithMatchingError(response:NSHTTPURLResponse?, reject:(error: ErrorType) -> Void) {
174-
if let sc = response?.statusCode {
175-
switch sc {
176-
case 401: reject(error:WSError.UnauthorizedError)
177-
case 404: reject(error:WSError.NotFoundError)
178-
default: reject(error:WSError.NetworkError)
179-
}
180-
} else {
181-
reject(error:WSError.NetworkError)
178+
func rejectCallWithMatchingError(response:NSHTTPURLResponse?, data:NSData? = nil, reject:(error: ErrorType) -> Void) {
179+
var error = WSError()
180+
error.httpStatusCode = response?.statusCode ?? 0
181+
if let d = data,
182+
json = try? NSJSONSerialization.JSONObjectWithData(d, options: NSJSONReadingOptions.AllowFragments),
183+
j = JSON(json) {
184+
error.jsonPayload = j
185+
}
186+
if let erroType = WSErrorType(rawValue: error.httpStatusCode) {
187+
error.type = erroType
182188
}
189+
reject(error:error)
183190
}
184191

185192
func methodForHTTPVerb(verb:WSHTTPVerb) -> Alamofire.Method {

0 commit comments

Comments
 (0)