Skip to content

Commit 7fbdb02

Browse files
committed
Merge branch 'develop' of https://github.com/biboran/RxSwift into biboran-develop
2 parents bb2bab2 + bbd2ddc commit 7fbdb02

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
@@ -37,6 +37,86 @@ extension ObservableType {
3737
return self.map { $0 }.subscribe(observer)
3838
}
3939

40+
/**
41+
Creates new subscription and sends elements to publish relay.
42+
43+
In case error occurs in debug mode, `fatalError` will be raised.
44+
In case error occurs in release mode, `error` will be logged.
45+
46+
- parameter to: Target publish relay for sequence elements.
47+
- returns: Disposable object that can be used to unsubscribe the observer.
48+
*/
49+
public func bind(to relay: PublishRelay<E>) -> Disposable {
50+
return subscribe { e in
51+
switch e {
52+
case let .next(element):
53+
relay.accept(element)
54+
case let .error(error):
55+
let error = "Binding error to publish relay: \(error)"
56+
#if DEBUG
57+
rxFatalError(error)
58+
#else
59+
print(error)
60+
#endif
61+
case .completed:
62+
break
63+
}
64+
}
65+
}
66+
67+
/**
68+
Creates new subscription and sends elements to publish relay.
69+
70+
In case error occurs in debug mode, `fatalError` will be raised.
71+
In case error occurs in release mode, `error` will be logged.
72+
73+
- parameter to: Target publish relay for sequence elements.
74+
- returns: Disposable object that can be used to unsubscribe the observer.
75+
*/
76+
public func bind(to relay: PublishRelay<E?>) -> Disposable {
77+
return self.map { $0 as E? }.bind(to: relay)
78+
}
79+
80+
/**
81+
Creates new subscription and sends elements to behavior relay.
82+
83+
In case error occurs in debug mode, `fatalError` will be raised.
84+
In case error occurs in release mode, `error` will be logged.
85+
86+
- parameter to: Target behavior relay for sequence elements.
87+
- returns: Disposable object that can be used to unsubscribe the observer.
88+
*/
89+
public func bind(to relay: BehaviorRelay<E>) -> Disposable {
90+
return subscribe { e in
91+
switch e {
92+
case let .next(element):
93+
relay.accept(element)
94+
case let .error(error):
95+
let error = "Binding error to behavior relay: \(error)"
96+
#if DEBUG
97+
rxFatalError(error)
98+
#else
99+
print(error)
100+
#endif
101+
case .completed:
102+
break
103+
}
104+
}
105+
}
106+
107+
/**
108+
Creates new subscription and sends elements to behavior relay.
109+
110+
In case error occurs in debug mode, `fatalError` will be raised.
111+
In case error occurs in release mode, `error` will be logged.
112+
113+
- parameter to: Target behavior relay for sequence elements.
114+
- returns: Disposable object that can be used to unsubscribe the observer.
115+
*/
116+
public func bind(to relay: BehaviorRelay<E?>) -> Disposable {
117+
return self.map { $0 as E? }.bind(to: relay)
118+
}
119+
40120
/**
41121
Subscribes to observable sequence using custom binder function.
42122

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)