티스토리 뷰
Observable
ReactiveX에서 옵저버는 Observable을 구독한다. Obseravable이 배출하는 하나 또는 연속된 항목에 옵저버는 반응한다. 이러한 패턴은 동시성 연산을 가능하게 한다. 그 이유는 Observable이 객체를 배출할 때까지 기다릴 필요 없이 어떤 객체가 배출되면 그 시점을 감시하는 관찰자를 옵저버 안에 두고 그 관찰자를 통해 배출 알림을 받으면 되기 때문이다.
출처 : reactivex.io/documentation/ko/observable.html
Observable은 '관측가능한' 객체를 말합니다.
Observable이 어떤 값을 방출하면 옵저버가 그 값을 확인하는 것 입니다.
Just
let observable1 = Observable.just(1)
observable1.subscribe { event in
print(event)
}
//next(1)
//completed
just는 하나의 값을 방출합니다.
observable1를 구독(확인)하니 1이 나오고 완료 메세지가 나옵니다.
Of
let observable2 = Observable.of(1, 2, 3)
observable2.subscribe { event in
print(event)
}
let observable3 = Observable.of([1, 2, 3])
observable3.subscribe { event in
print(event)
}
//next(1)
//next(2)
//next(3)
//completed
//next([1, 2, 3])
//completed
of는 여러개의 값을 방출합니다.
observable2를 구독(확인)하니 1이 나오고 연속해서 2, 3이 나온 후 완료 메세지가 나옵니다.
observable3를 구독(확인)하니 [1, 2, 3]의 배열이 나오고 완료 메세지가 나옵니다.
From
let observable4 = Observable.from([1, 2, 3, 4, 5])
observable4.subscribe { event in
print(event)
}
observable4.subscribe { event in
if let element = event.element {
print(element)
}
}
//next(1)
//next(2)
//next(3)
//next(4)
//next(5)
//completed
//1
//2
//3
//4
//5
From은 배열의 값을 방출합니다.
observable4를 구독(확인)하니 배열이 나오고 연속해서 나온 후 완료 메세지가 나옵니다.
let subscription4 = observable4.subscribe(onNext: { element in
print(element)
})
subscription4.dispose()
//1
//2
//3
//4
//5
observable은 옵저버가 게속해서 구독하기 때문에 메모리 누수가 생길 수 있습니다.
따라서 완료 후에는 dispose해줘야 합니다.
DisposeBag
let disposeBag = DisposeBag()
Observable.of("A", "B", "C")
.subscribe{
print($0)
}.disposed(by: disposeBag)
//next(A)
//next(B)
//next(C)
//completed
DisposeBag은 dispose할 객체들을 담는 가방이라고 생각하시면 됩니다.
여러가지 Observable객체들을 이 가방에 담아서 dispose할 수 있습니다.
Observable, Create, Subscribe
Observable<String>.create { observer in
observer.onNext("A")
observer.onCompleted()
observer.onNext("B")
return Disposables.create()
}.subscribe(onNext: { print($0) },
onError: { print($0) },
onCompleted: { print("Completed") },
onDisposed: { print("Disposed") }
)
.disposed(by: disposeBag)
//A
//Completed
//Disposed
Subscribe에는 onNext, onError, onCompleted, onDisposed가 있습니다.
처음에 A를 방출해서 print하고
onCompleted()를 호출해서 Completed를 print합니다.
그다음 B를 print할 것 같지만 이미 completed 됐기 때문에 onNext는 실행되지 않고
dispose되어 Disposed가 print됩니다.
'Swift' 카테고리의 다른 글
[Swift] Swift 언어의 특징 (0) | 2021.05.01 |
---|---|
[Swift] Delegation이란? (0) | 2021.04.09 |
[Swift] @escaping closure, 탈출 클로저 쉽게 이해하기 (0) | 2021.01.22 |
[RxSwift] toArray, map, flatMap, flatMapLatest (0) | 2020.12.23 |
[RxSwift] PublishSubject, BehaviorSubject, ReplaySubject, PublishRelay , BehaviorRelay (0) | 2020.12.23 |