상세 컨텐츠

본문 제목

throttle

iOS/Combine

by 쑤야. 2024. 2. 29. 13:51

본문

https://developer.apple.com/documentation/combine/fail/throttle(for:scheduler:latest:)

 

throttle(for:scheduler:latest:) | Apple Developer Documentation

Publishes either the most-recent or first element published by the upstream publisher in the specified time interval.

developer.apple.com

 

RxSwift와 Combine을 사용하면서 throttle에 대해 들어보기는 했는데, 제대로 사용해 보거나 공부해 본 적이 없다. 

 

throttle에 대해 학습하고, 현재 진행 중인 프로젝트에도 적용할 수 있는 부분이 있으면 적용해보고자 공부해 본다. 

 

Controlling Timing


thorttle은 Combine에서 Controlling Timing 섹션에 위치해 있다. 

 

이를 통해 대략적으로 시간과 관련한 개념임을 알 수 있다. 

 

throttle


 

throttle의 정의를 살펴보면, upstream publisher가 지정한 시간 간격으로 게시한 가장 최근의 요소 또는 첫 번째 요소를 방출한다고 한다. 

 

문서에서 제공하고 있는 예시로 이해를 해보자면,

cancellable = Timer.publish(every: 3.0, on: .main, in: .default)
    .autoconnect()
    .print("\(Date().description)")
    .throttle(for: 10.0, scheduler: RunLoop.main, latest: true)
    .sink(
        receiveCompletion: { print ("Completion: \($0).") },
        receiveValue: { print("Received Timestamp \($0).") }
     )

 

 

Timer가 3초에 한 번씩 실행되기에 날짜 포맷은 3초에 한 번씩 출력이 되고 있지만, thorttle로 인해 10초에 한 번씩 sink 블록이 실행되는 것을 확인할 수 있다. 

 

 

이번엔 다른 부분은 모두 동일하지만, throttle 부분만 제거하여 테스트를 해보았다. 

cancellable = Timer.publish(every: 3.0, on: .main, in: .default)
    .autoconnect()
    .print("\(Date().description)")
    .sink(
        receiveCompletion: { print ("Completion: \($0).") },
        receiveValue: { print("Received Timestamp \($0).") }
     )

 

날짜 포맷과 sink 블록 모두 3초에 한 번씩 수행되고 있다. 

 

이를 통해 throttle은 Publisher의 과도한 방출을 제어하는 역할을 할 수 있다는 것을 알 수 있다. 

 

만약 TextField의 값이 변경될 때마다 방출되며 이때 API가 요청되는 Publisher라면, 사용자가 타이핑하는 동안 네트워크 요청을 제한을 위해서 throttle을 사용하는 것이 적합할 것이다.

관련글 더보기