분석
기존의 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
'Swift 공부' 카테고리의 다른 글
WWDC 공부 정리 1차 Meet async/await in Swift (2) | 2024.09.16 |
---|---|
내부 DB 종류와 간단한 정리 (0) | 2024.06.23 |
Tuist , Swinject , Clean Architecture , MVVM - Coordinator (7) | 2022.04.26 |
Hashable , Equatable , Identifiable (0) | 2022.04.18 |
Tuist 3.x 라이브러리 등록 방법 (0) | 2022.04.17 |