rxSwift

[rxSwift] rxSwift의 심장, Observable 이란

웰코발 2022. 10. 18. 22:02

Observable<T>

  • T형태(Type)의 데이터 snapshot을 '전달'할 수 있는 일련의 이벤트를 비동기적(asynchronous)으로 생성하는 기능
  • Observable = Observable Sequence = Sequence
  • 다른 클래스에서 만든 값을 시간에 따라서 읽을 수가 있다
  • 하나 이상의 observer가 실시간으로 어떤 이벤트에 반응, 세 가지 유형의 이벤트만 방출 (next, error, completed)
  • Observable들은 일정 기간 동안 계속해서 이벤트를 생성(emit)
  • next라는 이벤트는 T에 해당하는 형태(Type)의 Element를 전달함, 클로저로 Element를 다룰 수 있음.
  • completed는 성공적으로 일련의 이벤트들을 종료시키는 것, Observable은 종료됨
  • error는 Swift에러를 감싸서 내뱉게 되는데, Observable이 에러를 발생시켜 추가적으로 이벤트를 생성하지 않을 것을 의미, 에러와 함께 Observable은 종료됨
  • tap과 같은 제스처도 element로 사용 가능 (rxCocoa의 기능과 함께 사용가능)
  • Observable 생명주기
    • Observable은 어떤 구성요소(elemnet)를 가지는 next이벤트를 계속해서 방출할 수 있음
    • Observable은 error이벤트를 방출하여 완전 종료될 수 있음
    • Observable은 complete 이벤트를 방출하여 완전 종료 될 수 있음

next 이벤트를 통해 각각의 요소들을 방출.

 

세 번의 tap 이벤트를 방출한 뒤 이벤트들이 다 방출되면 완전 종료.즉 completed이벤트가 발생.

 

1, 2를 방출하고 에러가 발생해 error를 방출 후 종료.

 

 

  • .next 이벤트는 어떠한 Element 인스턴스를 가지고 있는 것을 확인할 수 있다.
  • .error 이벤트는 Swift.Error 인스턴스를 가진다.
  • .completed 이벤트는 아무런 인스턴스를 가지지 않고 단순히 이벤트를 종료시킨다.
public enum Event<Element> {
  /// Next elemet is produced.
  case next(Element)
 	
  /// Sequence terminated with an error.
  case error(Swift.Error)
 	
  /// Sequence completed successfully.
  case completed
 }

 

  • 사용 예시
let observable = Observable<Int>.just(1) // 오로지 1(Int 타입)만을 방출

observable.subscribe(
    onNext: { data in
    	print(data) 		 // 1 
    },
    onError: { error in 
    	print(error)		 // error 시 error코드 방출 후 종료
    },
    onCompleted: { 
    	print("completed")    // 성공적으로 완료되면 무엇도 방출하지 않고 종료
    },
    onDisposed: { 
    	print("dispose done") // 종료 후 disposed
    }
)
//위 코드와 같은 맥락의 코드
let observable = Observable<Int>.just(1)

observable.subscribe { event in
    switch event {
    case .next(let value):
      	print(value)
    case .error(let error):
      	print(error)
    case .completed:
      	print("completed")
    }
}
.disposed(by: self.disposeBag)