Mastering RxSwift 1~2강: OT, Observables

sanghee·2021년 10월 19일
0

🧠RxSwift

목록 보기
1/3
post-thumbnail

Udemy에서 Mastering RxSwift in iOS 수업을 듣고 난 후 정리한 글입니다.

Section 1: Introduction

수업을 위해 RxSwift, RxCocoa, RxDataSources

# Pods for HelloRxSwift
  pod 'RxCocoa'
  pod 'RxDataSources'
  pod 'RxSwift'

Section 2: Observables

2-1. observable?

  • observable == sequence
  • 슬라이더는 사용자의 슬라이딩 이벤트를 관찰한다.

2-2. observable == 관찰

  • 1 → 1만을 관찰한다.
  • 2 → 1, 2을 관찰한다
  • 3 → [1, 2, 3] 배열을 관찰한다.
  • 4 → 배열 안의 1, 2, 3, 4을 관찰한다.

Observable.of(1, 2, 3, 4)와 Observable.from([1, 2, 3, 4])는 같다고 보면 된다.

let observable1 = Observable.just(1)
let observable2 = Observable.of(1, 2)
let observable3 = Observable.of([1, 2, 3])
let observable4 = Observable.from([1, 2, 3, 4])

2-3. subscription == 구독

4를 구독하고 이벤트를 출력하면 다음과 같이 나온다.

observable4.subscribe { event in
    print(event)
}
출력: next(1)
출력: next(2)
출력: next(3)
출력: next(4)
출력: completed

이벤트에서 숫자를 출력하려면 다음과 같이 한다.

observable4.subscribe { event in
    if let element = event.element {
        print(element)
    }
}

4와 다르게 3은 배열 전체를 관찰하므로 다음과 같이 출력된다.

observable3.subscribe { event in
    if let element = event.element {
        print(element)
    }
}
출력: [1, 2, 3]

if문으로 언랩핑하는 방법 말고 다른 방법이 있다.

observable4.subscribe(onNext: { element in
    print(element)
})

2-4. Dispose & Terminate

구독을 새롭게 변수에 할당하고, 변수를 dispose를 하는 방법이 있다. 메모리 누수를 방지한다.

let subscription4 = observable4.subscribe(onNext: { element in
    print(element)
})
        
subscription4.dispose()

위와 같이 관찰자를 생성하고 구독을 정의해 취소하는 방법도 있다. 그러나 한번에 할 수도 있다.

아래와 같이 "A", "B", "C"를 관찰하고 구독한다. 그리고 disposeBag을 통해 취소할 수 있다.

let disposeBag = DisposeBag()

Observable.of("A", "B", "C").subscribe {
    print($0)
}.disposed(by: disposeBag)

element를 직접 추가하고 구독하고 버리는 방법이 있다.

A 이후에 관찰자가 끝났기 때문에 onCompleted → onDisposed가 실행된다.

private extension ViewController {
    func createAndDispose() {
        Observable.of("A", "B", "C").subscribe {
                print($0)
        }.disposed(by: disposeBag)
        
        Observable<String>.create { observer in
            observer.onNext("A")
            observer.onNext("B")
            observer.onCompleted() // 완료. onCompleted -> onDisposed
            observer.onNext("?") // 실행 X
            return Disposables.create()
        }.subscribe(
            onNext: { print($0) },
            onError: { print($0) },
            onCompleted: { print("Completed") },
            onDisposed: { print("disposed") })
        .disposed(by: disposeBag)
    }
}
출력: A
출력: Completed
출력: disposed

전체 코드

import UIKit
import RxSwift

class ViewController: UIViewController {
    let observable1 = Observable.just(1)
    let observable2 = Observable.of(1, 2)
    let observable3 = Observable.of([1, 2, 3])
    let observable4 = Observable.from([1, 2, 3, 4])
    
    let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        subscribeNumbers()
        createAndDispose()
    }
}

private extension ViewController {
    func createAndDispose() {
        Observable.of("A", "B", "C").subscribe {
                print($0)
        }.disposed(by: disposeBag)
        
        Observable<String>.create { observer in
            observer.onNext("A")
            observer.onCompleted() // 완료. onCompleted -> onDisposed
            observer.onNext("?") // 실행 X
            return Disposables.create()
        }.subscribe(
            onNext: { print($0) },
            onError: { print($0) },
            onCompleted: { print("Completed") },
            onDisposed: { print("disposed") })
        .disposed(by: disposeBag)
    }
    
    func subscribeNumbers() {
        observable4.subscribe { event in
            if let element = event.element {
                print(element) // 1, 2, 3, 4
            }
        }

        observable3.subscribe { event in
            if let element = event.element {
                print(element) // [1, 2, 3]
            }
        }
        
        // disposeBag없이 dispose하기
        let subscription4 = observable4.subscribe(onNext: { element in
            print(element) // 1, 2, 3, 4
        })

        subscription4.dispose()
    }
}
profile
👩‍💻

0개의 댓글