본문 바로가기

Combine

[RxSwift/Combine] RxSwift Disposable vs Combine AnyCancellable

반응형

RxSwift의 Disposable, Combine의 AnyCancellable은 모두 구독을 처분, 취소하는 역할을 한다는 점에서 동일한 역할을 합니다.

 

중요한 차이점은 retain에 차이가 있어, 동작이 상이한 부분이 있다는 것입니다.

 

먼저 RxSwift의 Disposable은 subscribe 함수 내에서 observer에 의해 retain 되고 있습니다.

따라서 구독(subscribe) 이후 명시적으로 처분(dispose) 하지 않는다면, disposable은 complete, error가 발생하기 전까지 살아있게 됩니다.

 

반면 Combine의 AnyCancellable은 명시적으로 처분하지 않더라도, AnyCancellable을 소유하고 있는 객체가 소멸할 경우, 처분이 됩니다. 또한  AnyCancellable에 의해서만 관리되기 때문에 구독 결과를 저장하지 않을 경우 동작하지 않게 됩니다. (반면 RxSwift는 subscribe 결과를 저장하지 않더라도 동작합니다.)

 

위 코드에서 Disposable을 소유하고 있는 ViewController가 소멸했는데도 불구하고, 지정된 10회 이벤트를 수행하고 종료되는 것을 볼 수 있습니다.

 

 

반면 AnyCancellable은 소유하고 있는 객체 ViewController가 소멸 시, 이후 지정된 이벤트를 수행되지 않는다는 것을 알 수 있습니다.

 

 

 

결론

  1. RxSwift의 Disposable, Combine의 AnyCancellable은 구독을 처분한다는 점에서 동일하다.
  2. 차이점은 Dispoable은 observer에 의해 retain 되며, AnyCancellable은 그렇지 않다.
  3. Disposable은 명시적으로 처분하지 않는 이상 complete, error 전까지 살아있다.
  4. Disposable은 구독 시, 주입하지 않더라도 동작하게 된다.
  5. AnyCancellable은 명시적으로 처분하지 않더라도 객체 소멸 시, 처분된다.
  6. AnyCancellable은 구독 시, 구독 결과를 AnyCancellable 프로퍼티에 주입해야 한다.

 

반응형