ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - 2.Observable
    RxSwift 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

    https://ios-development.tistory.com/97

    '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
Designed by Tistory.