Reactorkit의 Pulse 구현부에 대해서

2025. 2. 18. 13:08·앱/Swift

@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
		}
	}
}
  1. wrappedValue가 변경되면 value를 변경
  2. value가 변경되면 riseValueUpdatedCount() 가 실행됨
  3. 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)
		}
	}
  1. reactor.state.map 으로 리액터의 값에 접근하여서 valueUpdatedCount가 변경되는걸 감지
  2. 해당 값을 감지하면 map 으로 observable의 value값을 방출
  3. 해당값을 구독하는것으로 값의 변화를 알수있음

결론

Pulse는 reactrokit에 있는 프로퍼티 래퍼로, state의 값이 변경됨을 감지할수 있도록 한다.

ractor.map().distinctUntilChanged()를 통해서 변경되지 않는값을 처리할수 있지만,

그렇게 하면 true, true와 같이 연속적으로 동일한 값이 들어오거나 혹은

state를 다시 되돌려줘야하는 번거로움이 있기 때문에 정말 값이 변경된것을 감지하기 위함이 아니라면

pulse를 사용하는것이 편리할듯 하다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'앱 > Swift' 카테고리의 다른 글

[iOS] ReactorKit을 Combine으로 구현하는 법  (0) 2026.01.18
[iOS] moya를 combine을 이용해서 구현해보자  (0) 2026.01.18
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' 카테고리의 다른 글
  • [iOS] ReactorKit을 Combine으로 구현하는 법
  • [iOS] moya를 combine을 이용해서 구현해보자
  • Moya Mock Data 사용하기(feat. test Double)
  • reactorkit에서 testcode 작성 하는법(feat. nimble)
진ddang
진ddang
안녕하세요 진땅의 개발자 블로그 입니다. 피드백은 환영입니다. 깃헙 : https://github.com/it794613
    반응형
  • 진ddang
    맛동산이
    진ddang
  • 전체
    오늘
    어제
    • 분류 전체보기 (202)
      • 일기 그리고 목표 (1)
      • 웹 (20)
        • 리액트 (19)
      • 앱 (118)
        • Swift 문법 (15)
        • Swift (68)
        • SwiftUI (32)
        • 리액트 네이티브 (3)
      • CS (30)
        • 컴퓨터그래픽스 (8)
        • 운영체제 (6)
        • 네트워크 (16)
      • 알고리즘 (13)
        • 백준 (12)
        • 프로그래머스 (1)
      • 대외활동 (7)
        • ict한이음(2022.04) (2)
        • 멋쟁이 사자처럼 (5)
        • Apple Developer Academy (0)
      • 다양한 내용들 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    cs
    swift concurrency
    백준
    멋사
    위젯킷
    스위프트
    ReactorKit
    멋쟁이사자처럼
    대외활동
    widgetkit
    c++
    composable architecture
    Swift
    uikit
    컴퓨터그래픽스
    dispatchqueue
    영남대
    알고리즘
    SwiftUI
    문법
    Protocol
    후기
    리액트
    운영체제
    네트워크
    widget
    스유
    TCA
    spritekit
    웹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
진ddang
Reactorkit의 Pulse 구현부에 대해서
상단으로

티스토리툴바