Combine의 스트림은 결국 시간에 따라 발생하는 이벤트의 나열이다. 따라서 이벤트 발생시점은 매우 중요하다. Timing 연산자는 이러한 이벤트 발생 시점에 대해 조작할 수 있는 연산자이다. 먼저 Delay 연산자는 말그대로 이벤트 발생시점을 늦춰주는 연산자이다. 이때 주의사항은 늦추는 시간을 그냥 Int값으로 받는 것이 아닌 Dispatchqueue.SchedulerTimeTypes.Stride로 받는다. 만약 Int값으로 주고싶다면 for 파라미터에 닷 세컨드 등으로 넣어주어야한다. 또한 메인 스레드에서 돌릴건지 글로벌에서 돌릴건지도 지정해줄 수 있다.
위 코드를 보면 알 수 있듯이 collect(byTime) 연산자는 특정 시간동안 Upstream의 이벤트를 모았다가 다운스트림에 내려보내주는 연산자이다. 이렇게 타이밍 연산자들은 메모리 해제를 언제할지도 신경써주어야한다.
debounce() 연산자는 빠른시간동안 갑자기 우후죽수 발생하는 이벤트를 그룹화하여, 일정 시간동안 이벤트가 발생하지 않으면 마지막 이벤트를 전달하는 연산자이다. 텍스트필드 입력 처리 같은 빠르게 변하는 값들을 처리할 때 유용하게 사용되어, 입력 값의 불필요한 반복 처리를 방지하기에 유용하다.
Throttle 연산자는 일정 주기마다 이벤트를 캐치해 전달하는 연산자이다. debounce 와 유사한 연산자인데 차이점을 알아보자. 먼저debounce는 지정된 시간 동안 추가 이벤트가 없을 때만 마지막 이벤트를 방출하는 반면, throttle은 지정된 시간 간격 동안 첫 번째 이벤트를 방출하고, 나머지는 무시하거나 마지막 이벤트만을 선택적으로 방출한다. 이를 적용하자면 debounce는 사용자 입력과 같이 마지막 이벤트가 중요한 상황에서, throttle은 주식 가격 갱신과 같이 과도한 이벤트 발생을 줄이는 상황에서 사용할 수 있다.
차이를 비유적으로 설명하자면 debounce는 버스 정류장에서 버스를 기다리는 상황과 비슷하다. 사람들이 정류장에 도착할 때마다, 버스는 출발을 조금 더 기다린다. 만약 사람들이 계속 도착한다면, 버스는 계속 출발을 미루게 된다. 하지만 일정 시간 동안 아무도 정류장에 도착하지 않으면, 버스는 그때서야 출발한다. 즉, 마지막 사람이 도착하고 나서 일정 시간이 지나야 버스가 출발하는 것이다
반면 throttle은 레스토랑에서 점심시간에 제한된 수의 식사 쿠폰을 나눠주는 상황과 비슷하다. 레스토랑은 1시간마다 첫 번째 도착한 손님에게만 식사 쿠폰을 제공한다. 이 시간 동안 다른 손님이 도착하더라도 추가 쿠폰은 주어지지 않는다. 만약 latest 파라미터가 true인 경우, 이 비유에서 마지막에 도착한 손님에게 쿠폰을 주는 것으로 생각할 수 있다. 즉 throttle은첫 번째 이벤트를 즉시 처리하고, 그 후 일정 시간 동안 발생하는 추가 이벤트를 무시하거나 마지막 이벤트만 선택적으로 처리하는 것이다.
timeout() 연산자는 네트워크 통신할 때 꽤나 유용하게 쓸 수 있는 연산자이다. 일정시간동안 어떤 이벤트든 발생하지 않으면 에러를 던지면서 종료시켜버린다. (예제에 사용된 CustomStringConvertible 프로토콜이 궁금하다면 여기로)
measureInterval(using:) 연산자는 퍼블리셔가 값을 방출하는 데 걸리는 시간 간격을 측정하는 데 사용된다. 각 방출 사이의 시간 간격을 측정하고, 그 결과를 DispatchTimeInterval (또는 사용된 스케쥴러에 따라 다른 적절한 시간 단위)으로 방출한다. 이를 통해 비동기 이벤트의 시간적 행동을 분석할 수 있다. 아무래도 분석용 연산자이다 보니 테스트 코드에서 자주 사용된다.
https://www.kodeco.com/5429795-reactive-programming-in-ios-with-combine/lessons/26
'Flutter' 카테고리의 다른 글
| Combine | 7. Scheduling Operators (0) | 2024.05.13 |
---|---|
Swift에서 CustomStringConvertible 프로토콜 활용하기 (0) | 2024.05.13 |
| Combine | 5. Combining Operators (0) | 2024.05.11 |
Flutter Widget의 작동원리 (0) | 2024.05.10 |
| Combine | 4. Filtering Operators (0) | 2024.05.09 |