Swift 공부

ReactorKit Pulse

코딩하는렝가 2022. 7. 11. 12:13

분석

 

기존의 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