본문 바로가기

개발

RxSwift Filtering Operators

728x90

RxSwift 필터링 연산자

RxSwift는 데이터 스트림을 선택적으로 처리하고 조작할 수 있는 풍부한 필터링 연산자 세트를 제공합니다. 이러한 연산자는 복잡한 데이터 흐름을 처리하는 반응형 애플리케이션을 구축하는 데 필수적입니다. RxSwift 필터링 연산자를 사용하는 방법에 대한 몇 가지 실제 예를 살펴보겠습니다.

1. 사용자 입력 필터링:

  • 문제: 텍스트 필드에서 사용자 입력을 검증하고 필터링하여 특정 기준을 충족하는지 확인합니다.
  • 해결책: 연산자를 사용하여 filter입력을 술어와 비교하고 유효한 값만 출력합니다.
import RxSwift



let nameTextField = UITextField()



let validNameObservable = nameTextField.rx.text

  .filter { $0.range(of: "[A-Za-z ]", options: .regularExpression).isNotEmpty }

  .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }



validNameObservable.subscribe(onNext: { name in

  print("Valid name: \(name)")

  // Perform an action based on the valid name

})

 

  • 설명:

filter정규 표현식을 사용하여 입력에 문자와 공백만 포함되어 있는지 확인합니다.
map유효한 입력에서 앞뒤 공백을 제거합니다.
클로저 subscribe는 추가 처리를 위해 유효한 이름을 처리합니다.

 

 

2. 중복된 네트워크 요청 제거:

  • 문제: 동일한 데이터에 대한 중복된 네트워크 요청을 방지합니다.
  • 해결책: 연산자를 사용하여 distinctUntilChanged지정된 비교 함수에 따라 고유한 값만 내보냅니다.
import RxSwift

import Moya



let provider = MoyaProvider<MyAPI>()



let distinctUserRequestObservable = provider.rx.request(.getUser(id: 123))

  .mapJSON()

  .asObservable()

  .distinctUntilChanged { $0["id"] as? Int }



distinctUserRequestObservable.subscribe(onNext: { user in

  print("User data: \(user)")

  // Update UI with user data

}, onError: { error in

  print("Error: \(error.localizedDescription)")

  // Handle network error

})

 

  • 설명:

distinctUntilChanged해당 속성에 따라 새로운 사용자 데이터만 방출되도록 보장합니다 id.
폐쇄 subscribe는 수신된 사용자 데이터나 네트워크 오류를 처리합니다.

 

 

3. API 호출 디바운싱:

  • 문제: 빠르게 변화하는 입력으로 인해 발생하는 API 호출 빈도를 줄이세요.
  • 해결책: 연산자 를 사용하여 throttle지정된 시간 간격이 경과할 때까지 새 값의 방출을 지연시킵니다.
import RxSwift



let searchTextField = UITextField()



let debouncedSearchQueryObservable = searchTextField.rx.text

  .throttle(2, scheduler: SerialDispatchQueueScheduler(qos: .background))

  .distinctUntilChanged()

  .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }



debouncedSearchQueryObservable.subscribe(onNext: { query in

  print("Search query: \(query)")

  // Perform a debounced search based on the query

})
  • 설명:

throttle새로운 쿼리 발행을 2초 지연시킵니다.
distinctUntilChanged동일한 연속 값을 걸러냅니다.
그런 다음, 잘린 쿼리를 사용하여 디바운스 검색을 수행합니다.

 

4. 시간 기반 이벤트 필터링:

  • 문제: 특정 시간 창 내에 발생하는 이벤트를 처리합니다.
  • 해결 방법: and 연산자를 사용하여 시간 기반 창을 만들고 해당 창 내에서 이벤트를 필터링합니다.windowfilter
import RxSwift



let buttonTapsObservable = button.rx.tap

  .window(timeInterval: 1, scheduler: MainScheduler.instance)

  .flatMap { window -> Observable<[Int]> in

    window.reduce(0, accumulator: +)

      .map { $0 / window.count }

      .asObservable()

  }

  .filter { $0 > 2 }



buttonTapsObservable.subscribe(onNext: { tapsPerSecond in

  print("Taps per second: \(tapsPerSecond)")

  // Handle high tap frequency

})

 

  • 설명:

window1초의 시간 창을 생성합니다.
flatMap각 창 내에서 초당 평균 탭을 계산합니다.
filter초당 2탭보다 큰 값만 방출합니다.
폐쇄 subscribe는 감지된 높은 탭 주파수를 처리합니다.

 

 

'개발' 카테고리의 다른 글

RxSwift Combining Operators  (0) 2024.07.09
RxSwift Transforming Operators  (0) 2024.07.09
RxSwift Observables and Subjects  (0) 2024.07.09
RxSwift Subjects  (0) 2024.07.09
RxSwift Observables  (0) 2024.07.09