iOS&Swift🍎/RxSwift

RxSwift 개념 정리 (Observable, Disposable)

천 원 2022. 10. 26. 03:57

RxSwift?

ReactiveX에서 만든 라이브러리입니다. (Reactive eXtension + Swift = RxSwift)

 

" RxSwift is a library for composing asynchronous and event-based code by using observable sequences and functional style operators, allowing for parameterized execution via schedulers. "

By Marin Todorov. ‘RxSwift - Reactive Programming with Swift.’ 

 

해석 해보면

RxSwift는 관찰 가능한 시퀀스와 함수 형태의 연산자를 사용하여 비동기 및 이벤트 기반 코드를 구성하기 위한 라이브러리이며, 스케줄러를 통해  parameterized된 실행을 허용합니다.'

 

 

음... 무슨 소리인지 잘 모르겠으니 핵심 키워드만 확인하겠습니다.

- 관찰 가능한(Observable)

- 함수 형태의 연산자(Operator)

- 비동기 및 이벤트

- 스케줄러

 

관찰 가능한(Observable)을 이해하려면 일단 반응형이 무엇인지 알아야 합니다.

 

 

반응형이란?

 

명령형 프로그래밍

var b = 27
var c = 33
var a = b + c
print(a) // 60
c = 40
print(a) // 60

 

반응형 프로그래밍

var b = 27
var c = 33
var a: Int {
    return b + c
}
print(a) // 60
c = 40
print(a) // 67

명령형 프로그래밍은 a에 값을 정한 이후 c의 값이 바뀌더라도 a의 값이 바뀌지 않지만, 반응형 프로그래밍은 c의 값이 변하는 것에 반응하여 a의 값이 바뀌는 형태입니다. 실제로 위 예제와 같은 코드를 짜게 되지는 않지만 이런 식의 형태라고 이해하시면 좋습니다. 

 

 

Observable

Observable 타입을 이용해서 관찰 가능한 흐름이 생성되게 됩니다. 즉, 이 타입을 이용해서 관찰을 하고 들어온 이벤트를 방출합니다. Observer가 Observable을 구독하는 형태입니다.

 

let items = [3.3, 4.0, 5.0, 2.0, 3.6, 4.8]

Observable.just(items)
    .subscribe(onNext: { value in
        print(value) // 출력 [3.3, 4.0, 5.0, 2.0, 3.6, 4.8]
    })
    .dispose()

 

just(Operator)를 확인해 보면 items를 Observable타입으로 생성 해줍니다.

 

subscribe를 통하여 Observer는 Observable을 구독하게 되고 Observable이 방출하는 이벤트를 수신할 수 있게 됩니다.

  • next: 최신/다음 데이터를 '전달'하는 이벤트
  • completed: 성공적으로 일련의 이벤트들을 종료시키는 이벤트. 즉, Observable(생산자)가 성공적으로 자신의 생명주기를 완료했으며, 추가적으로 이벤트를 생성하지 않을 것임을 의미
  • error: Observable이 에러를 발생하였으며, 추가적으로 이벤트를 생성하지 않을 것임을 의미 (에러와 함께 완전종료)    

 

let items = [3.3, 4.0, 5.0, 2.0, 3.6, 4.8]

Observable.just(items)
    .subscribe { value in  // next
        print("just - \(value)")
    } onError: { error in  // error
        print("just - \(error)")
    } onCompleted: { 	   // completed
        print("just - completed")
    } onDisposed: {    
        print("just - disposed")
    }
    .disposed(by: disposeBag)

/* 출력
just - [3.3, 4.0, 5.0, 2.0, 3.6, 4.8]
just - completed
just - disposed
*/

 

deinit 되는 시점이나 Observable의 completed 혹은 error 이벤트가 수신되면 Sequence가 종료되어 Disposed됩니다.

 

 

Disposable

위의 예제를 보면 completed가 실행된 후에 disposed가 실행된 모습을 볼 수 있습니다. 작업이 모두 완료된 후에 해당 작업을 정리? 처리? 해주는 역할이라고 생각하시면 될 것 같습니다.

Observable은 모두 Disposable을  Return 하는데 이를 통해서 스트림을 종료하고 실행되던 작업을 종료합니다.

 

그런데 위의 예제처럼 next 이벤트가 유한한 시점에서는 completed와 함께 disposed 되겠지만 UIbutton의 touch 이벤트 같은 next 이벤트를 무한히 방출하는 경우는 언제 disposed 될까요? 

 

위에서 말한 것처럼 completed나 error가 발생하지 않아도 class가 deinit이 되면 Disposed 되지만 RootVC같은 경우에는 앱이 실행중에 deinit이 발생할 일이 없으니 수동으로 disposed를 시켜주어야 합니다. 

2초 뒤에 disposed 시켜주어 메모리 낭비가 없도록 해줍니다. disposed가 호출 후에는 tap 이벤트가 발생하지 않습니다. 

즉 Observable은 재사용이 불가능합니다.

 

그런데 우리가 앱을 개발하다 보면 하나의 UI 객체만을 사용하는 게 아닌 여러 개를 사용하게 될텐데 아래와 같이 하나하나 dispose를 시켜주면 너무 번거롭습니다.

 

그럴때 사용하는게 disposeBag 인스턴스 입니다.

disposeBag 인스턴스를 생성 해주고 2초 뒤에 초기화 시켜주어 한 번에 리소스를 정리할 수 있습니다.

정상적으로 3개의 Button이 Dispoased 된 모습을 확인할 수 있습니다.

 

 

 

 

여기까지 RxSwift 개념 정리 (Observable, Disposable) 였습니다.

 

미니언.. 귀여워서..

 

 

공부자료:

🌱SeSAC iOS 2기 76회차, 77회차

https://dongminyoon.tistory.com/45

https://github.com/fimuxd/RxSwift/blob/master/Lectures/01_HelloRxSwift/Ch.1%20Hello%20RxSwift.md#a-rxswift

https://academy.realm.io/kr/posts/reactive-programming-with-rxswift/