Skip to content

Commit bbd2ddc

Browse files
committed
Added bind(to:) methods for PublishRelay and BehaviorRelay. Added relevant tests for binding.
1 parent 8c1f1de commit bbd2ddc

File tree

2 files changed

+160
-0
lines changed

2 files changed

+160
-0
lines changed

RxCocoa/Common/Observable+Bind.swift

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,86 @@ extension ObservableType {
7878
return self.map { $0 as E? }.bind(to: variable)
7979
}
8080

81+
/**
82+
Creates new subscription and sends elements to publish relay.
83+
84+
In case error occurs in debug mode, `fatalError` will be raised.
85+
In case error occurs in release mode, `error` will be logged.
86+
87+
- parameter to: Target publish relay for sequence elements.
88+
- returns: Disposable object that can be used to unsubscribe the observer.
89+
*/
90+
public func bind(to relay: PublishRelay<E>) -> Disposable {
91+
return subscribe { e in
92+
switch e {
93+
case let .next(element):
94+
relay.accept(element)
95+
case let .error(error):
96+
let error = "Binding error to publish relay: \(error)"
97+
#if DEBUG
98+
rxFatalError(error)
99+
#else
100+
print(error)
101+
#endif
102+
case .completed:
103+
break
104+
}
105+
}
106+
}
107+
108+
/**
109+
Creates new subscription and sends elements to publish relay.
110+
111+
In case error occurs in debug mode, `fatalError` will be raised.
112+
In case error occurs in release mode, `error` will be logged.
113+
114+
- parameter to: Target publish relay for sequence elements.
115+
- returns: Disposable object that can be used to unsubscribe the observer.
116+
*/
117+
public func bind(to relay: PublishRelay<E?>) -> Disposable {
118+
return self.map { $0 as E? }.bind(to: relay)
119+
}
120+
121+
/**
122+
Creates new subscription and sends elements to behavior relay.
123+
124+
In case error occurs in debug mode, `fatalError` will be raised.
125+
In case error occurs in release mode, `error` will be logged.
126+
127+
- parameter to: Target behavior relay for sequence elements.
128+
- returns: Disposable object that can be used to unsubscribe the observer.
129+
*/
130+
public func bind(to relay: BehaviorRelay<E>) -> Disposable {
131+
return subscribe { e in
132+
switch e {
133+
case let .next(element):
134+
relay.accept(element)
135+
case let .error(error):
136+
let error = "Binding error to behavior relay: \(error)"
137+
#if DEBUG
138+
rxFatalError(error)
139+
#else
140+
print(error)
141+
#endif
142+
case .completed:
143+
break
144+
}
145+
}
146+
}
147+
148+
/**
149+
Creates new subscription and sends elements to behavior relay.
150+
151+
In case error occurs in debug mode, `fatalError` will be raised.
152+
In case error occurs in release mode, `error` will be logged.
153+
154+
- parameter to: Target behavior relay for sequence elements.
155+
- returns: Disposable object that can be used to unsubscribe the observer.
156+
*/
157+
public func bind(to relay: BehaviorRelay<E?>) -> Disposable {
158+
return self.map { $0 as E? }.bind(to: relay)
159+
}
160+
81161
/**
82162
Subscribes to observable sequence using custom binder function.
83163

Tests/RxCocoaTests/Observable+BindTests.swift

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,86 @@ extension ObservableBindTest {
9494
}
9595
}
9696

97+
// MARK: bind(to:) publish relay
98+
99+
extension ObservableBindTest {
100+
func testBindToPublishRelay() {
101+
var events: [Recorded<Event<Int>>] = []
102+
103+
let relay = PublishRelay<Int>()
104+
105+
_ = relay.subscribe{ event in
106+
events.append(Recorded(time: 0, value: event))
107+
}
108+
109+
_ = Observable.just(1).bind(to: relay)
110+
111+
XCTAssertEqual(events, [
112+
next(1)
113+
])
114+
}
115+
116+
func testBindToOptionalPublishRelay() {
117+
var events: [Recorded<Event<Int?>>] = []
118+
119+
let relay = PublishRelay<Int?>()
120+
121+
_ = relay.subscribe{ event in
122+
events.append(Recorded(time: 0, value: event))
123+
}
124+
125+
_ = (Observable.just(1) as Observable<Int>).bind(to: relay)
126+
127+
XCTAssertEqual(events, [
128+
next(1)
129+
])
130+
}
131+
132+
func testBindToPublishRelayNoAmbiguity() {
133+
var events: [Recorded<Event<Int?>>] = []
134+
135+
let relay = PublishRelay<Int?>()
136+
137+
_ = relay.subscribe{ event in
138+
events.append(Recorded(time: 0, value: event))
139+
}
140+
141+
_ = Observable.just(1).bind(to: relay)
142+
143+
XCTAssertEqual(events, [
144+
next(1)
145+
])
146+
}
147+
}
148+
149+
// MARK: bind(to:) behavior relay
150+
151+
extension ObservableBindTest {
152+
func testBindToBehaviorRelay() {
153+
let relay = BehaviorRelay<Int>(value: 0)
154+
155+
_ = Observable.just(1).bind(to: relay)
156+
157+
XCTAssertEqual(relay.value, 1)
158+
}
159+
160+
func testBindToOptionalBehaviorRelay() {
161+
let relay = BehaviorRelay<Int?>(value: 0)
162+
163+
_ = (Observable.just(1) as Observable<Int>).bind(to: relay)
164+
165+
XCTAssertEqual(relay.value, 1)
166+
}
167+
168+
func testBindToBehaviorRelayNoAmbiguity() {
169+
let relay = BehaviorRelay<Int?>(value: 0)
170+
171+
_ = Observable.just(1).bind(to: relay)
172+
173+
XCTAssertEqual(relay.value, 1)
174+
}
175+
}
176+
97177
// MARK: bind(to:) curried
98178

99179
extension ObservableBindTest {

0 commit comments

Comments
 (0)