-
[RxSwift/RxCocoa] Subject는 알겠는데, Relay는 뭐지?앱등이에게 살충제를 뿌린다./Swift 2020. 3. 14. 18:34
오 마이갓..
Ray Wenderlich의 RxSwift를 2번이나 완독하고 프로젝트에 투입되었는데..
아는 것보다 모르는 게 더 많다😭
Ray Wenderlich에서는 RxCocoa에 대해서는 별로 다루지 않았기 때문이다.
------------------------------------------------------------------------------------------------
일단 PublishRelay, BehaviorRelay에 대해서 살펴보자.
/// BehaviorRelay is a wrapper for `BehaviorSubject`.
///
/// Unlike `BehaviorSubject` it can't terminate with error or completed.
public final class BehaviorRelay<Element>: ObservableType {
private let _subject: BehaviorSubject<Element>
/// Accepts `event` and emits it to subscribers
public func accept(_ event: Element) {
self._subject.onNext(event)
}
/// Current value of behavior subject public
var value: Element {
// this try! is ok because subject can't error out or be disposed
return try! self._subject.value()
}
/// Initializes behavior relay with initial value.
public init(value: Element) {
self._subject = BehaviorSubject(value: value)
}
/// Subscribes observer
public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
return self._subject.subscribe(observer)
}
/// - returns: Canonical interface for push style sequence
public func asObservable() -> Observable<Element> {
return self._subject.asObservable()
}
}
RxCocoa에 선언된 주석에도 wrapper for `BehaviorSubject`라고 되어있다.
1.
accpet()를 호출하면 subject의 onNext()를 호출한다.
즉, onNext대신 accpet를 호출하자.
2.
value라는 프로퍼티를 통해 현재 시퀀스의 가장 마지막 element에 접근할 수 있다.
난 Variable이 deprecated된 줄도 몰랐다.
(Ray Wenderlich의 RxSwift 교재는 iOS12에 머물러 있음 ㅠㅠ)
3.
Unlike `BehaviorSubject` it can't terminate with error or completed.
error또는 completed에 의해 시퀀스가 종료되지 않는다.
즉, 쓸때까지 쓰고 dispose를 해주면 된다.
UI 이벤트에 사용하기 적절하다.
예시는 BehaviorRelay로만 사용했지만 PublishRelay도 코드를 보면 똑같이 Wrapping하고 있음을 확인할 수 있다.
가장 큰 차이점은 위 3번 설명이라고 볼 수 있겠다.
'앱등이에게 살충제를 뿌린다. > Swift' 카테고리의 다른 글
[RxSwift] Rx Observer들의 기본 스케쥴러 (0) 2020.09.11 [RxSwift/RxCocoa] RxCocoa에서 TableView사용하는 코드를 쪼개서 이해해보자. (0) 2020.03.15 Swiftlint를 통해서 프로젝트에서 느낌표(!)를 제거해보자 (0) 2019.12.19 오늘의 삽질: dyld: Library not loaded: @rpath/XCTest.framework/XCTest (0) 2019.10.21 [GCD] DispatchQueue.. main큐와 gloabal큐? sync와 asnyc? 궁금증 해결해보자. (2) 2018.09.04