본문 바로가기

Swift 공부

ReactorKit Pulse

분석

 

기존의 Reactor Kit 에서 state의 값을 사용하게 되면 모든 mutation에 반응하여 state 값이 트리거가 생기게 되고 해당 실행되게 된다.

그래서 의도하지않는 state에 따른 함수 실행을 막기위해  아래와 같이  .distinctUntilChanged() 을 사용하여 방지하였다.

 

reactor.state.map { $0.overseasEmpty }
            .distinctUntilChanged()
            .filterNil()
            .bind(with: self, onNext: { owner, data in
                owner.myListPager.setEmptyView(index: FavoriteTabItem.overseaRoom.index)
            }).disposed(by: disposeBag)

매번 새롭게 코드를 추가할때마다 .distinctUntilChanged() 을 추가 해주는 작업은 상당히 귀찮고, 실수로 해당값을 빼놓기라도 한다면 의도치 않게 함수가 실행되 버그를 초래 할 수 있다.

그런 문제들을 해결해주는게 Pulse이다 
Pulse의 사용방법은 Reactor 안의 State에 변수를 선언할때 @propertyWrapper로 만들어진 Pulse를 변수앞에 선언을 해준다.

struct State {
    @Pulse var myFavoriteTicket: [TicketProduct]?
}

 

Pulse의 내부구조는 생각보다 단순하다 새로운 값이 들어 올 때마다 내부에 정의된 valueUpdatedCount가 증가된다.

초기값 value : nil  valueUpdatedCount : 0

1 입력 value : 1  valueUpdatedCount : 1

2 입력 value : 2  valueUpdatedCount : 2

사용방법은 아래와 같다 기존에 reactor.state.map{ $0.myFavoriteTicket }

하던것들을 pulse 로 처리하게 된다면 이제 state가 변화가 있을때 마다 비즈니스 로직이 호출되지않고 pulse 내부적으로

valueUpdatedCount를 비교하여 값을 방출해준다.

reactor.pulse(\.$myFavoriteTicket)
          .bind(with: self) { owner, sort in
              //비즈니스로직
          }
          .disposed(by: disposeBag)



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