RxSwift에서 데이터의 전달을 위해서 Observable과 Observer라는 개념이 등장한다.
Observable
이름 그대로 '관측 가능한' 객체를 의미하며, 다양한 방식으로 데이터를 비동기적으로 전달하는 역할을 수행한다.
Combine에서 Publisher와 유사한 개념이며, 하나 이상의 Observer가 실시간으로 이벤트에 반응할 수 있도록 새 값을 방출(emit)한다.
Emission
Observable이 이벤트를 방출하는 것을 Emission이라고 한다.
Next 이벤트 수행을 통해 다양한 값을 전달하며, 라이프사이클 내에 한 번도 수행되지 않을 수도 있다.
Completed / Error
Observable의 라이프사이클 가장 마지막에 수행되는 작업이며, Emission이 아니라 일종의 Notification이다.
성공적으로 마무리 되는 경우에는 Completed가 수행되고, 에러가 발생할 경우에는 Error가 수행된다.
수행 이후에는 모든 리소스가 정리되며 새로운 데이터를 방출하지 않는다.
Observable의 생성 방법
create 연산자 사용
create 연산자를 사용해서 Observable의 구체적인 이벤트 방출 방식을 직접 구현할 수 있다.
trailing closure의 마지막에는 Disposable을 반환해야 한다.
Observable<Int>.create { (observer) -> Disposable in
observer.on(.next(0)) // on 메소드에 next를 사용
observer.onNext(1) // onNext 메소드 사용
observer.onCompleted() // completed Event
return Disposables.create() // disposable 반환
}
다양한 기본 구현 연산자 사용
단순히 한 개의 데이터 혹은 하나의 배열을 순서대로 방출하는 등의 Observable은 이미 만들어진 연산자를 사용할 수 있다.
Observable.just(0) // 0 하나 방출 후 completed
Observable.from([0, 1, 2, 3]) // 0, 1, 2, 3을 순서대로 방출 후 completed
Observer
Observable을 관측하는 객체를 뜻하며, Combine에서의 Subscriber와 유사한 개념이다.
모든 이벤트에 대한 전달은 실제로 구독이 시작된 시점부터 받을 수 있다.
즉, Observable을 아무리 생성을 해도 실제로 구독을 하지 않으면 아무런 데이터의 전달이 없다는 뜻이다.
Subscribe
Observable 객체에서 subscribe 연산자 수행을 통해 Observer를 구현할 수 있다.
let bag = DisposeBag()
let oj = Observable<Int>.just(1)
oj.subscribe { print("oj", $0) }.disposed(by: bag)
let of = Observable<Int>.from([1,2,3])
of.subscribe { print("of", $0) }.disposed(by: bag)
위의 코드를 통해 생성된 Observable을 구독하고 next와 completed가 수행되는 것을 확인할 수 있다.
subscribe 클로저 내부에서 값을 직접 다루고 싶을 때는 element를 사용하면 된다.
element는 옵셔널이기 때문에 옵셔널 바인딩을 사용해서 데이터를 다뤄야 한다.
let o = Observable<Int>.from([1,2,3])
o.subscribe {
print($0)
if let e = $0.element {
print("element:",$0)
}
}.disposed(by: bag)
RxSwift의 기본 개념인 Observable과 Observer에 대해 정리해보았다.
다음 포스트에서는 Dispose의 개념에 대해 다루도록 하겠다.
개인적인 공부를 위해 작성한 내용이므로 틀린 내용이나 수정이 필요한 부분이 있을 수 있으니 감안하고 봐주시면 감사하겠습니다.
'Swift > RxSwift' 카테고리의 다른 글
[RxSwift] Disposable와 DisposeBag (0) | 2024.04.01 |
---|---|
[RxSwift] RxSwift란 (0) | 2024.01.12 |