Created
October 8, 2019 13:30
-
-
Save tokijh/ea0c989c7bdf51d4f8931035eb091bee to your computer and use it in GitHub Desktop.
Subscribe 를 한 번만 할 수 있도록 하는 Operator 입니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import RxSwift | |
import class Foundation.NSRecursiveLock | |
extension ObservableType { | |
func limitSubscribe() -> Observable<Element> { | |
return LimitSubscribe<Element>(source: self.asObservable()).asObservable() | |
} | |
} | |
final class LimitSubscribe<Element>: ObservableType { | |
private let lock = NSRecursiveLock() | |
private var isSubscribed: Bool = false | |
private let source: Observable<Element> | |
init(source: Observable<Element>) { | |
self.source = source | |
} | |
func subscribe<Observer>(_ observer: Observer) -> Disposable where Observer : ObserverType, LimittedSubscribeObservable.Element == Observer.Element { | |
self.lock.lock(); defer { self.lock.unlock() } | |
if self.isSubscribed { | |
#if DEBUG | |
fatalError("This Observable can subscribe only once!") | |
#else | |
observer.onCompleted() | |
#endif | |
return Disposables.create() | |
} else { | |
self.isSubscribed = true | |
return self.source.subscribe(observer) | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let stream = Observable.of(["A", "B"]) | |
.limitSubscribe() | |
stream.subscribe() | |
stream.subscribe() // crash! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment