-
RxSwift - 2.ObservableRxSwift 2023. 2. 28. 20:52
Observable
- Observable은 observable, observable sequence, sequence라고도 불립니다.
- Observable은 Events를 발생시킵니다.
Observable Events 및 Life Cycle
1. Next
- 값을 방출하는 이벤트(Observable을 Subscribe하고 있는 Observer(Subscriber)에게 데이터를 전달)
2. Completed
- 종료 이벤트
3. Error
- 오류가 발생했음을 알리고 종료시키는 이벤트
Observable Create Operator
1. Observable.just
- 단일 요소를 방출하는 Observable을 반환합니다.
- 타입추론을 해줍니다.
let observable = Observable.just(1)
2. Observable.of
- 주어진 요소들을 방출하는 Observable을 반환합니다.
- 타입추론을 해줍니다.
let observable = Observable.of(1, 2, 3)
3. Observable.from
- 주어진 Array의 요소들을 방출하는 Observable을 반환합니다.
- 타입추론을 해줍니다.
let observable = Observable.from([1, 2, 3])
4. Observable<Element>.create
- 클로저를 이용해서 Observable을 만듭니다.
- 타입을 명시해줘야 합니다.
let observable = Observable<Int>create { (observer) -> Disposable in observer.onNext(1) observer.onNext(2) observer.onCompleted() return Disposables.create() }
5. Observable<Element>.empty
- 완료 이벤트를 발생시키는 빈 Observable을 반환합니다.
- 타입을 명시해줘야 합니다.
let observable = Observable<Void>.empty()
6. Observable<Element>.never
- 아무런 이벤트도 방출하지 않는 끝나지 않는 Observable을 반환합니다.
- 타입을 명시해줘야 합니다.
let observable = Observable<Void>.never()
7. Observable.range(start: , count: )
- 지정된 범위의 값을 방출하는 Observable을 반환합니다.
let observable = Observable.range(start: 1, count: 10)
8. Observable<Element>.deferred
- Observable의 생성을 지연하여 subscribe될 때 새로운 Observable을 생성합니다.
let observableFactory = Observable<Any>.deferred { //Observable Factory Method }
Observable subscribing
- Observable을 subscribing하여 해당 Observable이 방출하는 이벤트를 subscribe메소드를 사용하여 처리합니다.
1. Observable.subscribe(_ observer: ObserverType) -> Disposable
- ObserverType을 이용해서 Observable을 subscribing합니다. Disposable은 추후 설명 예정.
protocol ObserverType { func on(_ event: Event<Element>) } class Observer: ObserverType { ... func on(_ event: Event<Element>) { //Event Handler Method } } let observer = Observer() let disposeBag = DisposeBag() Observable.from([1, 2, 3]) .subscribe(observer) .disposed(by: disposeBag)
2. Observable<Data>.subscribe(_ on: (Event<Data>) -> Void) -> Disposable
- 클로저 Event Handler를 이용해 Observable을 subscribing합니다.
let disposeBag = DisposeBag() Observable.from([1, 2, 3]) .subscribe { event in // Event Handler }.disposed(by: disposeBag)
3. Observable<Data>.subscribe(onNext: ((Int) -> Void)?, onError: ((Error) -> Void)?, onCompleted: (() -> Void)?, onDisposed: (() -> Void)?) -> Disposable
- 각 처리할 이벤트에 해당하는 클로저 Handler를 이용해 Observable을 subscribing합니다.
let disposeBag = DisposeBag() Observable.from([1, 2, 3]) .subscribe( onNext: { // Next Event Handler }, onError: { // Error Event Handler }, onCompleted: { // Completed Event Handler }, onDisposed: { // Disposed Event Handler } ).disposed(by: disposeBag)
Disposing & DisposeBag
1. Disposing
- subscribe를 취소합니다.
let subscription = Observable.from([1, 2, 3]) .subscribe { event in // Event Handler } subscription.dispose()
2. DisposeBag
- 메모리가 해제될 때 subscribe를 dispose해줘야 한다. 하지만 여러개의 Observable을 subscribe하는 경우에는 일일이 dispose를 해줘야 합니다. DisposeBag을 사용하면 이를 쉽게 해결할 수 있습니다. DisposeBag은 subscribe시 반환되는 Disposable을 담아두고, DisposeBag이 메모리에서 해제될 때 담겨있는 모든 Disposable을 dispose해주는 타입입니다.
- DisposeBag은 RxSwift에서 Disposable의 메모리를 관리해주는 Type이라고 할 수 있습니다.
let disposeBag = DisposeBag() Observable.from([1, 2, 3]) .subscribe { event in // Event Handler }.disposed(by: disposeBag)
참조
RxSwift Reactive Programming with Swift thirdnbsped by raywenderlich team's book
https://reactivex.io/documentation/observable.html
https://github.com/ReactiveX/RxSwift/blob/main/Documentation/GettingStarted.md
'RxSwift' 카테고리의 다른 글
RxSwift - 4.Hot Observable, Cold Observable (0) 2023.03.03 RxSwift - 3.Subjects (0) 2023.03.02 RxSwift - 1.Reactive Programming, RxSwift 개념 (0) 2023.02.27 Functional Programming (0) 2023.02.24