Skip to content

Commit 41c558d

Browse files
Chainable onSuccess and onFailure.
1 parent 3b0a22d commit 41c558d

File tree

3 files changed

+50
-63
lines changed

3 files changed

+50
-63
lines changed

Tests/swift-sdk-swift-tests/PromiseTests.swift

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ class PromiseTests: XCTestCase {
2525
let f1 = createSucessfulFuture(withValue: "zeeString")
2626
let f2 = f1.map {$0.count}
2727

28-
f2.onSuccess = { (value) in
28+
f2.onSuccess { (value) in
2929
XCTAssertEqual(value, "zeeString".count)
3030
expectation1.fulfill()
31-
}
32-
f2.onFailure = {_ in
31+
} .onFailure { _ in
3332
expectation2.fulfill()
3433
}
3534

@@ -45,10 +44,9 @@ class PromiseTests: XCTestCase {
4544
let f1: Future<String, MyError> = createFailureFuture(withError: MyError(message: "zeeErrorMessage"))
4645
let f2 = f1.map {$0.count}
4746

48-
f2.onSuccess = { (value) in
47+
f2.onSuccess { (value) in
4948
expectation1.fulfill()
50-
}
51-
f2.onFailure = {error in
49+
}.onFailure { error in
5250
XCTAssertEqual(error.message, "zeeErrorMessage")
5351
expectation2.fulfill()
5452
}
@@ -69,11 +67,10 @@ class PromiseTests: XCTestCase {
6967
return self.createSucessfulFuture(withValue: firstValue + firstValue)
7068
}
7169

72-
f2.onSuccess = { (secondValue) in
70+
f2.onSuccess { (secondValue) in
7371
XCTAssertEqual(secondValue, "zeeStringzeeString")
7472
expectation1.fulfill()
75-
}
76-
f2.onFailure = {_ in
73+
} .onFailure { _ in
7774
expectation2.fulfill()
7875
}
7976

@@ -93,10 +90,9 @@ class PromiseTests: XCTestCase {
9390
return self.createSucessfulFuture(withValue: "zeeString")
9491
}
9592

96-
f2.onSuccess = { (secondValue) in
93+
f2.onSuccess { (secondValue) in
9794
expectation1.fulfill()
98-
}
99-
f2.onFailure = {(error) in
95+
} .onFailure {(error) in
10096
XCTAssertEqual(error.message, "zeeErrorMessage")
10197
expectation2.fulfill()
10298
}
@@ -117,10 +113,9 @@ class PromiseTests: XCTestCase {
117113
return self.createFailureFuture(withError: MyError(message: "zeeErrorMessage"))
118114
}
119115

120-
f2.onSuccess = { (secondValue) in
116+
f2.onSuccess { (secondValue) in
121117
expectation1.fulfill()
122-
}
123-
f2.onFailure = {(error) in
118+
}.onFailure {(error) in
124119
XCTAssertEqual(error.message, "zeeErrorMessage")
125120
expectation2.fulfill()
126121
}
@@ -136,11 +131,10 @@ class PromiseTests: XCTestCase {
136131

137132
let f1: Future<String, MyError> = Promise<String, MyError>(value: "zeeValue")
138133

139-
f1.onSuccess = { (value) in
134+
f1.onSuccess { (value) in
140135
XCTAssertEqual(value, "zeeValue")
141136
expectation1.fulfill()
142-
}
143-
f1.onFailure = {_ in
137+
}.onFailure { _ in
144138
expectation2.fulfill()
145139
}
146140

@@ -155,10 +149,9 @@ class PromiseTests: XCTestCase {
155149

156150
let f1: Future<String, MyError> = Promise<String, MyError>(error: MyError(message: "zeeErrorMessage"))
157151

158-
f1.onSuccess = { (value) in
152+
f1.onSuccess { (value) in
159153
expectation1.fulfill()
160-
}
161-
f1.onFailure = { error in
154+
}.onFailure { error in
162155
XCTAssertEqual(error.message, "zeeErrorMessage")
163156
expectation2.fulfill()
164157
}

swift-sdk/Internal/IterableAPIInternal.swift

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,11 @@ final class IterableAPIInternal : NSObject, PushTrackerProtocol {
112112

113113
if let userId = userId {
114114
// if we are using userId, then create a user first, then register
115-
let future = createUser(withUserId: userId).flatMap({ (_) in
115+
createUser(withUserId: userId).flatMap({ (_) in
116116
return self.register(token: token, appName: appName, pushServicePlatform: self.config.pushPlatform)
117-
})
118-
119-
future.onSuccess = { (json) in
117+
}).onSuccess { (json) in
120118
onSuccess?(json)
121-
}
122-
123-
future.onFailure = { (error) in
119+
}.onFailure { (error) in
124120
onFailure?(error.errorMessage, error.data)
125121
}
126122
} else {
@@ -531,17 +527,11 @@ final class IterableAPIInternal : NSObject, PushTrackerProtocol {
531527
}
532528

533529
@discardableResult func sendRequest(_ request: URLRequest, onSuccess: OnSuccessHandler? = nil, onFailure: OnFailureHandler? = nil) -> Future<SendRequestValue, SendRequestError> {
534-
let future = NetworkHelper.sendRequest(request, usingSession: networkSession)
535-
536-
future.onSuccess = { (json) in
530+
return NetworkHelper.sendRequest(request, usingSession: networkSession).onSuccess { (json) in
537531
onSuccess?(json)
538-
}
539-
540-
future.onFailure = { (failureInfo) in
532+
}.onFailure { (failureInfo) in
541533
onFailure?(failureInfo.errorMessage, failureInfo.data)
542534
}
543-
544-
return future
545535
}
546536

547537
// MARK: For Private and Internal Use ========================================>
@@ -607,8 +597,7 @@ final class IterableAPIInternal : NSObject, PushTrackerProtocol {
607597
return
608598
}
609599

610-
let future = notificationStateProvider.notificationsEnabled
611-
future.onSuccess = {(authorized) in
600+
notificationStateProvider.notificationsEnabled.onSuccess { (authorized) in
612601
if authorized {
613602
self.notificationStateProvider.registerForRemoteNotifications()
614603
}
@@ -797,11 +786,9 @@ final class IterableAPIInternal : NSObject, PushTrackerProtocol {
797786
return
798787
}
799788

800-
let future = NetworkHelper.sendRequest(request, usingSession: networkSession)
801-
future.onSuccess = { (json) in
789+
NetworkHelper.sendRequest(request, usingSession: networkSession).onSuccess { (json) in
802790
self.handleDDL(json: json)
803-
}
804-
future.onFailure = { (failureInfo) in
791+
}.onFailure { (failureInfo) in
805792
if let errorMessage = failureInfo.errorMessage {
806793
ITBError(errorMessage)
807794
}

swift-sdk/Internal/Promise.swift

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,31 @@ enum Result<Value, ErrorType> {
1818
// or there is a failure with error
1919
// There is no way to set value a result in this class.
2020
class Future<Value, ErrorType> {
21-
var onSuccess: ((Value) -> Void)? = nil {
22-
didSet {
23-
// if a successful result already exists (from constructor), report it
24-
if case let Result.value(value)? = result {
25-
onSuccess?(value)
26-
}
21+
fileprivate var successCallback: ((Value) -> Void)? = nil
22+
fileprivate var failureCallback: ((ErrorType) -> Void)? = nil
23+
24+
@discardableResult func onSuccess(block: ((Value) -> Void)? = nil) -> Future<Value, ErrorType> {
25+
self.successCallback = block
26+
27+
// if a successful result already exists (from constructor), report it
28+
if case let Result.value(value)? = result {
29+
successCallback?(value)
2730
}
31+
32+
return self
2833
}
2934

30-
var onFailure : ((ErrorType) -> Void)? = nil {
31-
didSet {
32-
// if a failed result already exists (from constructor), report it
33-
if case let Result.error(error)? = result {
34-
onFailure?(error)
35-
}
35+
@discardableResult func onFailure(block: ((ErrorType) -> Void)? = nil) -> Future<Value, ErrorType> {
36+
self.failureCallback = block
37+
38+
// if a failed result already exists (from constructor), report it
39+
if case let Result.error(error)? = result {
40+
failureCallback?(error)
3641
}
42+
43+
return self
3744
}
38-
45+
3946
fileprivate var result: Result<Value, ErrorType>? {
4047
// Observe whenever a result is assigned, and report it
4148
didSet { result.map(report) }
@@ -45,11 +52,11 @@ class Future<Value, ErrorType> {
4552
private func report(result: Result<Value, ErrorType>) {
4653
switch result {
4754
case .value(let value):
48-
onSuccess?(value)
55+
successCallback?(value)
4956
break
5057
case .error(let error):
5158
print("calling onFailure")
52-
onFailure?(error)
59+
failureCallback?(error)
5360
break
5461
}
5562
}
@@ -59,19 +66,19 @@ extension Future {
5966
func flatMap<NextValue>(_ closure: @escaping (Value) -> Future<NextValue, ErrorType>) -> Future<NextValue, ErrorType> {
6067
let promise = Promise<NextValue, ErrorType>()
6168

62-
onSuccess = { value in
69+
onSuccess { (value) in
6370
let future = closure(value)
6471

65-
future.onSuccess = { futureValue in
72+
future.onSuccess { futureValue in
6673
promise.resolve(with: futureValue)
6774
}
6875

69-
future.onFailure = { futureError in
76+
future.onFailure { futureError in
7077
promise.reject(with: futureError)
7178
}
7279
}
7380

74-
onFailure = { error in
81+
onFailure { error in
7582
promise.reject(with: error)
7683
}
7784

@@ -81,12 +88,12 @@ extension Future {
8188
func map<NextValue>(_ closure: @escaping (Value) -> NextValue) -> Future<NextValue, ErrorType> {
8289
let promise = Promise<NextValue, ErrorType>()
8390

84-
onSuccess = { value in
91+
onSuccess { value in
8592
let nextValue = closure(value)
8693
promise.resolve(with: nextValue)
8794
}
8895

89-
onFailure = { error in
96+
onFailure { error in
9097
promise.reject(with: error)
9198
}
9299

0 commit comments

Comments
 (0)