Rx

[ReactorKit] @Pulse

Phililip
728x90

안녕하세요.

 

요즘 업무가 많아서.. 글 쓰는 게 좀 뜸했네요...ㅠㅠ

 

늦었지만, 이번에는 ReactorKit의 @Pulse 라는 property wrapper에 대해 알아볼게요.

(이전  [ReactorKit] ReactorKit 입문 글에서 사용했던 Counter 예제를 이어서 사용할 겁니다.)


# @Pluse 란? 

Pulse has diff only when mutated To explain in code, the results are as follows.

Use when you want to receive an event only if the new value is assigned, even if it is the same value. like 
alertMessage.

 

'Pulse는 수정될 때(mutated)만 diff를 갖는다. 같은 값일지라도 값이 새로 할당될 때 이벤트를 받고 싶은 경우에 사용한다.'

 

 

 

설명이 살짝 애매한데, 제가 이해한 토대로 설명을 해볼게요.

 

Pulse라는 property wrapper를 사용하면, 같은 값이든 다른 값이든 상관없이 값이 새롭게 할당되는 경우에 이벤트가 발생한다.

 

 

 

아래는 이전 Counter 예제를 통해 구현한 ViewController와 CounterViewReactor 전체 코드입니다.

 

여기에 살을 붙여볼게요.

 

 

 

 

## State 이벤트 (기존 방식)

ViewController 쪽 코드에서 주의 깊게 살펴봐야 하는 코드가 있습니다.

 

바로 이 부분인데요.

 

map을 통해 State -> 특정 Action으로 값을 변경하고, distinctUntilChanged으로 값(value)이 변할 때만 이벤트를 받도록 했어요.

 

여기서 distinctUntilChanged를 사용했다는 것이 중요 포인트예요.

 

 

왜 distinctUnitChanged를 사용했을까요?? 

 

 

State 이벤트는 State 내부의 값이 변하든 변하지 않든 State 객체가 통째로 바뀌든 mutate를 거쳐서 reduce를 통해 State가 반환되는 경우에 이벤트가 발생하기 때문입니다.

 

reduce method 내부를 아래처럼 기존 state를 그대로 반환하도록 변경하고 debug 로그를 찍어보면 이벤트가 계속 발생하는 것을 알 수 있어요.

 

 

 

 

즉!!!

 

Action 발생 시 mutate를 거쳐 reduce를 통해 state를 반환합니다. 이때 이벤트가 발생하는데, 내가 원하는 프로퍼티가 다른 값으로 바뀌었을 때만 이벤트를 받기 위해서 distinctUntilChanged를 사용했다고 볼 수 있어요.

 

 

그런데 어쩔 때는 값이 같을지라도 값이 할당될 때마다 이벤트를 발생시키고 싶을 때가 있어요.

(대표적으로 Alert 창을 띄워야 하는 경우겠죠???)

 

 

이때 Pulse property wrapper를 사용합니다ㅎㅎ

 

 

 

## Pulse 사용법

Counter 예제를 이용해서 +/- 버튼을 누르면 적절한 Alert 창을 띄워주도록 할게요.

 

State 구조체 안에 alertMessage라는 프로퍼티를 추가해주고 나머지 코드들도 거기에 맞게 적당히 바꿔줄게요.

(이때 alertMessage 프로퍼티는 @Pluse property wrapper로 선언해줘야 합니다!)

 

 

 

구독하는 곳(ViewController)에서 아래처럼 구독을 해주면 끝입니다.

 

 

 

잘 동작하네요ㅎㅎㅎ 😁

 

 

 

 

## 그래서 기존 방식하고 Pulse 하고 무슨 차이인데?

위에서 State 이벤트는 값이 변하든 안 변하든 상관없이, 이벤트가 항상 오는 것을 확인했습니다.

 

하지만 Pulse property wrapper를 사용하면 값이 새롭게 할당(assign) 되는 상황에만 이벤트가 발생한다는 것입니다.

 

 

즉, reduce 함수를 아래처럼 수정해도, Pulse property wrapper로 선언한 프로퍼티는 이벤트가 안 온다는 것이죠.

 

 

 

 

 

그럼 이렇게도 생각할 수 있을 것 같아요.

 

"State 이벤트 받을 때 distinctUntilChanged를 사용 안 하면 Pulse property wrapper랑 똑같이 동작하는 거 아님??"

 

아쉽지만 틀린 생각입니다.

 

 

distinctUntilChanged를 사용하지 않았을 때 State의 특정 프로퍼티가 값이 변하거나 새로 할당될 때만 이벤트가 오는 것이 아닙니다.

 

전혀 상관없는 다른 프로퍼티의 값이 바뀌게 되는 경우에도 이벤트가 오기 때문이지요.

 

 

그에 반해 Pulse property wrapper를 사용하게 되면, 특정 프로퍼티에 값이 새로 할당되는 경우에만 이벤트가 발생하기 때문에, 다른 프로퍼티 값이 바뀌어도 이벤트가 오지 않는 것입니다.

 

 

이 둘의 차이가 이해가 되시나요???ㅎㅎ

 

이 부분은 잘 이해하고 사용해야 할 것 같아요ㅎㅎ

 

 

 

 

# 참고

- https://github.com/ReactorKit/ReactorKit

 

GitHub - ReactorKit/ReactorKit: A library for reactive and unidirectional Swift applications

A library for reactive and unidirectional Swift applications - GitHub - ReactorKit/ReactorKit: A library for reactive and unidirectional Swift applications

github.com

 


 

이번 글은 여기서 마무리.

 

 

 

반응형