Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 알고리즘
- composable architecture
- dispatchqueue
- 영남대
- 문법
- 백준
- 컴퓨터그래픽스
- 스위프트
- 멋사
- 운영체제
- widget
- swift concurrency
- 웹
- 대외활동
- cs
- Swift
- widgetkit
- TCA
- uikit
- Protocol
- 리액트
- 스유
- 위젯킷
- ReactorKit
- spritekit
- 네트워크
- 후기
- SwiftUI
- 멋쟁이사자처럼
- c++
Archives
- Today
- Total
맛동산이
Reactorkit의 Pulse 구현부에 대해서 본문
@Pluse 란?
Pulse has diff only when mutated To explain in code, the results are as follows.
'Pulse는 수정된 값이 동일할지라도 이벤트를 받을수 있음 즉, 이벤트가 false, false, false 이렇게 와도 개별적 이벤트를 받을수 있다.
어떻게 이게 가능한지 내부 로직을 한번까보자
Pulse 내부 동작
@propertyWrapper
public struct Pulse<Value> {
public var value: Value {
didSet {
self.riseValueUpdatedCount()
}
}
public internal(set) var valueUpdatedCount = UInt.min
public init(wrappedValue: Value) {
self.value = wrappedValue
}
public var wrappedValue: Value {
get { return self.value }
set { self.value = newValue }
}
public var projectedValue = Pulse<Value> {
return self
}
private mutating func riseValueUpdatedCount() {
if self.valueUpdatedCount == UInt.max {
self.valueUpdatedCount = UInt.min
} else {
self.valueUpdatedCount += 1
}
}
}
- wrappedValue가 변경되면 value를 변경
- value가 변경되면 riseValueUpdatedCount() 가 실행됨
- riseValueUpdatedCount() 결과로 내부의 valueUpdatedCount값이 +1 됨
Pulse 변경동작
reactor.pulse(\\.$~~)로 되어있는 Pulse
extension Reactor {
public func pulse<Result>(_ transfromToPulse: @escaping (State) throws ->
Pulse<Result>) -> Observable<Result> {
return self.state.map(transformToPulse)
.distinctUntilChanged(\\.valueUpdatedCount)
.map(\\.value)
}
}
- reactor.state.map 으로 리액터의 값에 접근하여서 valueUpdatedCount가 변경되는걸 감지
- 해당 값을 감지하면 map 으로 observable의 value값을 방출
- 해당값을 구독하는것으로 값의 변화를 알수있음
결론
Pulse는 reactrokit에 있는 프로퍼티 래퍼로, state의 값이 변경됨을 감지할수 있도록 한다.
ractor.map().distinctUntilChanged()를 통해서 변경되지 않는값을 처리할수 있지만,
그렇게 하면 true, true와 같이 연속적으로 동일한 값이 들어오거나 혹은
state를 다시 되돌려줘야하는 번거로움이 있기 때문에 정말 값이 변경된것을 감지하기 위함이 아니라면
pulse를 사용하는것이 편리할듯 하다.
반응형
'앱 > Swift' 카테고리의 다른 글
Moya Mock Data 사용하기(feat. test Double) (0) | 2025.01.31 |
---|---|
reactorkit에서 testcode 작성 하는법(feat. nimble) (0) | 2025.01.31 |
CustomView) Two Button Slider 구현하기 UIkit (0) | 2024.10.17 |
Swift) deepLink, Universal Link 처리하기 (1) | 2024.09.17 |
Swift) Error type에 대해서 (1) | 2024.08.25 |