Driver vs Signal

안녕하세요 👋

이번 포스팅에서는 RxCocoa의 Trait 중 DriverSignal
각자 어떤 특징을 가지고 있고, 또 어떤 차이점이 있는지에 대해서 개념과 실제 코드를 작성해서 알아볼게요 ~~

Trait

Observable과 Trait은 유사하지만, Trait은 좀더 특수한 목적이나 케이스를 위해 만들어진 Observable 입니다.

Driver

그렇다면, Driver는 어떤 목적을 위해 만들어진 Observable 일까요?

먼저, RxCocoa에 존재하는 Trait이기 때문에 UI를 위해 만들어진 혹은 UI에 특화된 Observable입니다.

왜냐면, Driver.swift 파일의 설명에도 나와있듯이 Driver는 아래의 특징을 가지고 있습니다.

  • 절대 실패하지 않음
  • 이벤트가 MainScheduler.instance에서 이뤄지도록 함
  • share(replay: 1, scope: .whileConnected)를 통해 이벤트를 공유하고, 새로운 구독이 생기면 마지막 element를 1개만큼 공유하고 시작!

UI는 계속 표시되어야하고(실패했다고 사라지거나 해서는 안되겠죠?) 메인스레드에서 업데이트 되어야하기 때문에 이를 고려해봤을때 왜 UI에 특화된 Observable인지 느낌이 확 오네요.

그리고, Observable event에 대한 구독은subscribe 가 아닌, drive(onNext: _)를 통해 구현합니다.

driverInterval
    .drive(onNext: { count in
        print("Origin Driver Count is: \(count)")
    })
    .disposed(by: disposeBag)

Signal

Driver 에 대해 이해가 잘 되었다면, Signal 의 이해도 어렵지 않습니다!! 왜냐면, 둘의 차이점은 한 가지 밖에 없기 때문인데요 ㅎㅎ

  • 절대 실패하지 않음
  • 이벤트가 MainScheduler.instance에서 이뤄지도록 함
  • share(scope: .whileConnected)를 통해 이벤트를 공유

그리고, Observable event에 대한 구독은subscribe 가 아닌, emit(onNext: _)를 통해 구현합니다.

signalInterval
    .emit(onNext: { count in
        print("Origin Signal Count is: \(count)")
    })
    .disposed(by: disposeBag)

차이점

혹시, 정리된 특징에서 차이점을 찾으셨나요?

이 두 개 Trait의 차이점은 바로! 마지막 element를 새로운 구독자에게 공유하는지 안하는지에 있습니다.

마지막 element를 공유하는가? Driver ✅ 마지막 element를 공유하는가? Signal ❌

코드

초기화 시점에 3초마다 숫자가 증가하는 interval Observable을
Driver와 Signal 모두 생성하고 구독까지 해놓은 상태입니다.

그렇다면, 콘솔창에는 Driver와 Signal 구독에 따른 로그가 찍히고 있겠죠?

Origin Driver Count is: 1 -> 2 -> 3 -> 4 Origin Signal Count is: 1 -> 2 -> 3 -> 4

이때, 4까지 카운트 된 상황에서 Driver와 Signal에 새로운 구독이 추가되면 어떻게 될까요?

Driver: 마지막 element인 4를 출력하고, 3초가 지나고 다음 element 5를 출력 Singal: 3초가 지나고, 다음 element 5를 출력

정리하며

각 Trait의 특징과 코드를 통한 차이점 분석까지 해보았는데요! 그럼, 각 Trait은 어떤 상황에서 쓰는것이 더 적합할까요? 🤔

  • Driver는 마지막 element를 받고서 시작하기 때문에, 지속적으로 변하는 상태를 반영하는데에 더 적합한 Trait.

  • Signal은 한 번만 발생하는 이벤트를 처리하는데 더 적합한 Trait.

전체 코드는 제 깃허브 레포지토리에 있습니다. 읽어주셔서 감사합니다. 😊

Categories:

Updated:

Leave a comment