Skip to content

Instantly share code, notes, and snippets.

@tokijh
Created October 8, 2019 13:30
Show Gist options
  • Save tokijh/ea0c989c7bdf51d4f8931035eb091bee to your computer and use it in GitHub Desktop.
Save tokijh/ea0c989c7bdf51d4f8931035eb091bee to your computer and use it in GitHub Desktop.
Subscribe 를 한 번만 할 수 있도록 하는 Operator 입니다.
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)
}
}
}
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