본문 바로가기
iOS/RxSwift

[RxSwift] Filtering Operators

by 0inn 2022. 10. 12.

어느새 .. 2장으로 .. operator들 살펴보러 갑시다 . . !

다시 한 번 RxSwift: Reactive Programming with Swift 책과 한글로 정리된 github 참고하면서 작성 중입니다. . !

Ignoring operators

1. IgnoreElements()

 

 

ignoreElements는 .next 이벤트를 무시하고, .completed나 .error 같은 정지 이벤트는 허용합니다.

 

[코드]

example(of: "ignoreElements") {
  let strikes = PublishSubject<String>()

  let disposeBag = DisposeBag()

  strikes
    .ignoreElements()
    .subscribe { _ in
      print("You're out!")
    }
    .disposed(by: disposeBag)
    
    strikes.onNext("X")
	strikes.onNext("X")
	strikes.onNext("X")
    
    strikes.onCompleted()
		
        
    --- Example of: ignoreElements ---
    You're out!
    -> .completed 이벤트만 허용
}

 

2. elementAt

 

 

Observable에서 방출된 n번째 요소만 처리하고 싶을 때 사용합니다. 해당하는 index만 방출하고 나머지는 무시합니다.

 

[코드]

 example(of: "elementAt") {
 
     let strikes = PublishSubject<String>()
     let disposeBag = DisposeBag()
     
     strikes
         .elementAt(2)
         .subscribe(onNext: { _ in
             print("You're out!")
         })
         .disposed(by: disposeBag)
     
     strikes.onNext("X")
     strikes.onNext("X")
     strikes.onNext("X")
     
     --- Example of: elementAt ---
     You're out!
     -> 두 번째 인덱스인 세 번째 값을 방출
 }

 

3. filter

 

filter는 필터링 요구사항이 한 가지 이상일 때 사용할 수 있습니다.

 

 

 

위 경우에는 filter를 거치면 3보다 작은 요소인 1, 2만 출력됩니다.

 

[코드]

 example(of: "filter") {
     
     let disposeBag = DisposeBag()
     
     Observable.of(1,2,3,4,5,6)
         .filter({ (int) -> Bool in
             int % 2 == 0
         })
         .subscribe(onNext: {
             print($0)
         })
         .disposed(by: disposeBag)
         
         --- Example of: filter ---
         2
         4
         6
         -> 2로 나눈 나머지가 0인 경우만 필터링
 }

Skipping operators

1. skip

 

skip 연산자는 첫 번째 요소부터 n개의 요소를 skip 합니다.

 

 

skip(2) 연산을 통해 처음 2개의 요소가 skip되는 것을 알 수 있습니다.

 

2. skipWhile

 

skipWhile은 어떤 요소를 skip하지 않을 때까지 skip하고 종료하는 연산자입니다.

skipWhile은 skip할 로직을 구성하여 해당 로직이 false가 되면 방출합니다. filter와 반대

 

 

1은 해당 로직이 true이기 때문에 skip되고, 2는 로직이 false이기 때문에 방출됩니다.

3은 로직이 true임에도 이미 1을 한 번 skip 했으므로 방출됩니다.

 

3. skipUntil

 

skipUntil은 다른 observable이 트리거할 때까지 현재 observable에서 방출하는 이벤트를 skip합니다.

즉, 다른 observable이 .next 이벤트를 방출하기 전까지 기존 observable에서 방출하는 이벤트들을 무시합니다.

 

Taking Operators

1. take

 

take는 skip과 반대되는 개념으로 RxSwift에서 어떤 요소를 취하고 싶을 때 사용하는 연산자입니다.

 

 

take(2)를 통해 처음 2개의 값을 방출할 수 있습니다.

 

2. takeWhile

 

takeWhile은 skipWhile 처럼 작동합니다.

 

 

takeWhile 구문 내에 설정한 로직에서 true에 해당하는 값만 방출합니다.

 

3. enumerated

 

방출된 요소의 index를 참고하고 싶은 경우 enumerated 연산자를 사용하면 됩니다 . . !

기존 Swift의 enumerated 메소드와 유사하게 Observable에서 나오는 각 요소의 index와 값을 포함하는 튜플을 생성합니다.

 

[코드]

 example(of: "takeWhile") {
     let disposeBag = DisposeBag()
     
     Observable.of(2,2,4,4,6,6)
     	// (0, 2)(1, 2) ... (5, 6)의 tuple 형태로 담김
         .enumerated()
         .takeWhile({ index, value in
         	// value가 짝수면서 index가 3 미만인 요소만 take
             value % 2 == 0 && index < 3
         })
         // map을 통해 value만!
         .map { $0.element }
         .subscribe(onNext: {
             print($0)
         })
         .disposed(by: disposeBag)
         
         --- Example of: takeWhile ---
         2
         2
         4
 }

 

4. takeUntil

 

 

takeUntil은 skipUntil과 유사하게 trigger가 되는 Observable이 구독되기 전까지의 이벤트값만 받습니다.

Distinct operators

Distinct operator란 중복해서 이어지는 것을 막아주는 연산자입니다.

 

1. distinctUntilChanged

 

 

2가 연달아 두 번 반복되었으므로 뒤에 나온 2가 방출되지 않습니다.

1은 중복이지만 연달아 반복된 것이 아니므로 그대로 배출됩니다.

 

2. distinctUntilChanged(_:)

 

distinctUntilChanged에서 비교로직을 구현하고 싶을 때 사용합니다.

 

 

value의 값을 비교하며 중복된 값을 제외합니다.

'iOS > RxSwift' 카테고리의 다른 글

[RxSwift] Combining Operators  (0) 2022.11.18
[RxSwift] Transforming Operators  (0) 2022.11.17
[RxSwift] Subjects  (0) 2022.10.12
[RxSwift] Observable  (0) 2022.10.11
[RxSwift] Hello, RxSwift !  (1) 2022.10.11