RxSwift

[RxSwift] Observable, Observer, Subscribe, Dispose

yujaehui 2024. 5. 23. 23:29

이벤트를 방출하는 Observable

이벤트를 관찰 및 처리하는 Observer

이 둘을 연결하는 것이 Subscribe

이 둘의 연결을 끊는 것이 Dispose


1. Observable

Observable은 RxSwift에서 시퀀스, 스트림 등으로 불리며, 비동기적으로 이벤트를 방출(emit)하는 시퀀스를 의미한다.

Observable은 시간이 지남에 따라 여러 이벤트를 발생시킬 수 있으며, 각 이벤트는 값을 포함할 수도, 에러 또는 완료를 나타낼 수도 있다.


2. Observable의 이벤트

Observable은 대표적으로 세 가지 이벤트를 방출한다.

  • next: 새로운 값을 방출하는 이벤트.
  • error: 오류가 발생하여 시퀀스를 종료하는 이벤트.
  • completed: 모든 값을 방출한 후 시퀀스를 종료하는 이벤트.

Observable은 next 이벤트로 값을 방출하다가, error 또는 completed 이벤트가 발생하면 종료된다.

종료된 Observable은 더 이상 이벤트를 방출하지 않는다.

또한 error 이벤트와 completed 이벤트 중 하나만 발생하며, 동시에 발생하지 않는다.


3. Observable 생성

Observable은 다양한 방법으로 생성할 수 있다.

  • just: 하나의 요소를 포함하는 Observable 생성.
  • of: 여러 요소를 포함하는 Observable 생성.
  • from: 배열을 개별 요소로 변환하여 Observable 생성.
  • create
  • defferd
let observable1 = Observable.just(1)            // 하나의 요소
let observable2 = Observable.of(1, 2, 3)        // 여러 요소
let observable3 = Observable.from([1, 2, 3])    // 배열을 개별 요소로 변환

4. Subscribe - Observable 구독

Observable은 생성하더라도 구독자가 생길 때까지 이벤트를 방출하지 않는다.

subscribe 메서드로 이루어지며, next, error, completed 이벤트에 대한 핸들러를 지정할 수 있다.

let observable = Observable.of(1, 2, 3)
  
observable.subscribe { event in    // 구독
  print(event)                     // 핸들러 지정
}

 

이 코드는 각각의 next 이벤트와 마지막에 completed 이벤트를 방출한다.

(오류가 발생하지 않기 때문에 error 이벤트는 방출되지 않는다.)


5. Dispose - Observable 구독 해제

구독을 통해 Observable의 이벤트를 수신하지만, 때로는 구독을 명시적으로 해제해야 한다.

dispose 메서드를 호출하여 수행하며, RxSwift는 이를 자동으로 관리하기 위한 DisposeBag을 제공한다.

let disposeBag = DisposeBag()

Observable.of(1, 2, 3)
  .subscribe { event in
	  print(event)
  }
	.disposed(by: disposeBag)    // 구독 해제

6. Observable 생성자를 이용한 이벤트 직접 정의

create 연산자를 사용하면 Observable이 방출할 이벤트를 직접 정의가 가능하다.

let disposeBag = DisposeBag()

Observable<String>.create { observer in
  observer.onNext("A")
  observer.onCompleted()
  return Disposables.create()
}
.subscribe(
  onNext: { print($0) },
  onError: { print($0) },
	onCompleted: { print("Completed") },
  onDisposed: { print("Disposed") }
)
.disposed(by: disposeBag)

 

위 코드를 실행하게 되면 "A"라는 값을 방출한 후 completed 이벤트를 발생시키고 종료한다.


7. Observable 팩토리 생성하기

deferred 연산자를 사용하면 구독 시점에 새로운 Observable을 생성할 수 있다.

let disposeBag = DisposeBag()
var flip = false

let factory: Observable<Int> = Observable.deferred {
  flip.toggle()
  return flip ? Observable.of(1, 2, 3) : Observable.of(4, 5, 6)
}

for _ in 0...3 {
  factory.subscribe(onNext: { print($0, terminator: "") })
    .disposed(by: disposeBag)
  print()
}

 

위 코드는 구독할 때마다 다른 Observable을 반환하여, 123 또는 456의 시퀀스를 번갈아 출력한다.


8. Observer

Observer는 Observable에서 방출하는 이벤트를 받아 처리한다.

즉, Observer는 Observable을 구독하며, 이 구독을 통해 Observable이 방출하는 데이터를 받을 수 있다.

Observer는 데이터의 수신, 오류 처리, 완료 처리 등을 수행합니다.


9. Observer의 이벤트 관찰 및 처리

Observer는 다음과 같은 메서드를 통해 이벤트를 처리한다.

  • onNext: Observable에서 새로운 데이터를 방출할 때 호출.
  • onError: 오류가 발생했을 때 호출.
  • onCompleted: Observable이 더 이상 데이터를 방출하지 않을 때 호출.

'RxSwift' 카테고리의 다른 글

[RxSwift] RxSwift로 키보드가 화면을 가릴 때 해결하기!  (0) 2024.06.27
[RxSwift] Single  (0) 2024.06.03
[RxSwift] Subscribe vs. Bind vs. Drive  (0) 2024.05.31
[RxSwift] Driver  (0) 2024.05.31
[RxSwift] Subject, Relay  (0) 2024.05.29