[RxSwift] Observable, Subscribe, Disposable, DisposeBag

jinny·2022년 10월 6일
1

RxSwift

목록 보기
5/10
post-thumbnail

Observable


📚 개념

  • Observer(관찰자)의 관찰 대상이 된다. (= Observer는 Observable을 구독한다.)
  • Subscribe(구독)를 통해 변화를 감지할 수 있다.
  • Event Sequence를 비동기적으로 생성한다.
  • string, int 등 모든 타입(generic)을 반환한다.

💡 Sequence란?
: 한번에 하나씩 단계별로 진행할 수 있는 값 목록


📖 구성 요소

  • next
    : 새로운 항목들을 배출할 때마다 호출하며, Observable이 배출하는 항목을 파라미터로 받는다.
  • complete
    : Observable이 마지막 next를 호출한 뒤에 호출한다. (complete 호출 후 자동으로 구독 종료(dispose))
  • error
    : 기대하는 데이터가 생성되지 않았거나 오류가 발생할 경우, error를 알리기 위해 호출한다. (error 호출 후 자동으로 구독 종료(dispose))

✏️ 예시) Observable.create()로 알아보는 구조

: 직접 Observer 메서드를 호출하여 Observable을 생성한다.

// 실행 코드
let observable = Observable.create { observer -> Disposable in
	observer.on(.next(1))
    observer.on(.next(2))
    observer.on(.next(3))
    		.
            .
            .
    observer.on(.next(n))
    observer.on(.completed)
    
    return Disposables.create {
    	print("disposed")
    }
}

observable.subscribe {
	print($0)
}
// 결과
next(1)
next(2)
next(3)
   .
   .
   .
next(n)
completed
disposed

📖 Hot vs Cold

  • Hot Observable
    : 생성되자 마자 항목들을 배출하는 Observable
    → 해당 Observable을 구독하는 Observer들은 어떤 경우에는 항목들이 배출되는 중간부터 Observable을 구독할 수 있다.
  • Cold Observable
    : 구독되기 전까지 항목을 배출하지 않는 Observable
    → 해당 Observable을 구독하는 Observer들은 Observable이 배출하는 항목 전체를 구독할 수 있도록 보장받는다.






Subscribe


📚 개념

  • 구성요소로 next, complete, error를 가지고 있는 Observable에게 Event를 받아 Observer에게 전달하는 역할을 한다.
  • return 타입은 Disposable이다.

📖 Observable.subscribe() 기본형태

Observable.subscribe(onNext: { (event) in
	// 필요한 연산을 처리한다.
}, onError: {
	// 실패한 호출에 대응한다.
}, onCompleted: {
	// 최종 응답 후 정리 작업을 한다.
}, onDisposed : {
	// dispose 후 처리 작업을 한다.
})






Disposable


📚 개념

  • 구독하고 있는 Observable을 종료하기 위한 역할을 한다.
  • 구독을 종료함으로써 메모리를 효율적으로 관리한다.

📖 Disposable 구조

: protocol type으로 dispose() func을 가진다.

public protocol Disposable {
	func dispose()
}

✏️ 예시) Disposable.create() 사용방법

Observable<String>.create { observer in
    observer.onNext("A")
    observer.onCompleted() // 완료시점
    observer.onNext("?") // 이전에 완료되었기 때문에 출력 x
    return Disposables.create() // dispose 생성
}.subscribe(onNext: { 
	print($0)
}, onError: {
	print($0)
}, onCompleted: {
	print("completed")
}, onDisposed: {
	print("disposed")
})
.disposed(by: disposeBag)
A
completed
disposed






DisposeBag


📚 개념

  • 하나 또는 여러 개의 Disposable을 관리하는 역할을 한다.
  • 일종의 Disposable을 담아두는 가방이다.
  • Observer들의 구독을 적절한 때에 모두 dispose할 경우에 쓰인다.

✏️ 예시) disposeBag 사용방법

// 실행코드
let disposeBag = DisposeBag()

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



참고 사이트

🏷 https://reactivex.io/documentation/ko/observable.html
🏷 https://www.udemy.com/course/mastering-rxswift-in-ios/
🏷 https://zeddios.tistory.com/1340
🏷 https://42kchoi.tistory.com/311?category=975878
🏷 https://ntomios.tistory.com/10
🏷 https://pixabay.com



💥 공부를 위한 정리글이기 때문에 잘못된 부분이 있을 수 있습니다. 💥

profile
우당탕탕 지니

0개의 댓글