apple/RxSwift, ReactorKit

[week7] ⏰ Time Based Operators(cold? hot?)

lgvv 2021. 7. 12. 12:16

✅ 이번 시간에는 시간과 관련한 오퍼레이터들을 볼 예정이야.

일부는 이전 포스팅에서 이미 사용했던 것들이지만, 재점검 할겸 중복될 수 있어.

 

실습 코드 

https://github.com/lgvv/MyRxSwift

 

lgvv/MyRxSwift

나의 RxSwift 공부 기록장. Contribute to lgvv/MyRxSwift development by creating an account on GitHub.

github.com

 

커리큘럼

https://github.com/lgvv/RxSwiftStudy/blob/main/week7_1.md

 

lgvv/RxSwiftStudy

RxSwift를 공부하는 Repository입니다.🐍. Contribute to lgvv/RxSwiftStudy development by creating an account on GitHub.

github.com

 

✅ 들어가기에 앞서...

why? 반응형 프로그래밍의 핵심은 시간에 따른 비동기 데이터 흐름을 모델링 하는것! (Reactive -> Rx!)

what? 시간 및 시간의 흐름에 따라 시퀀스가 반응하고 변형되는 방식을 처리할 수 있는 연산자들을 알아볼 것이다.

 

(목차)
1. delaySubscription

 - ⭐️ cold? hot?

2. delay

3. timer

4. timeout

 

 

✅ 1. delaySubscription

 - delay와 비슷하지만, 구독 자체를 늦게하여, 들어오는 이벤트도 알 수 없다.

        print(" ===== delaySubscription ===== ")
        Observable.of(1,2,3,4,5)
            .delaySubscription(.seconds(Int(5)), scheduler: MainScheduler.instance)
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
            
// 결과값
(5초 지연 후)
1
2
3
4
5

지연 시간동안 들어오는 이벤트가 구독이 안되어 있어서 처리가 안돼. 즉, 구독받는 시점 자체를 뒤로 미룬다는 말이야. 그럼 일정 요소를 건너 뛸 수도 있어.

 

🔸 cold? hot?

cold와 hot에 대한 설명!

 

 

✅ 2. delay

 - 이건 다른 시간에도 본적이 있는데, 시퀀스의 시작 시점을 아예 뒤로 미루는거야. 즉, 구독 시점 이후 이벤트가 들어오면 모두 알고 있다가 요소를 방출하는 것을 지연시간 후에 보내. 이게 구독을 아예 지연시키는 거랑 차이가 있어.

        print(" ===== delay ===== ")
        Observable.of(1,2,3,4,5)
            .delay(.seconds(Int(5)), scheduler: MainScheduler.instance)
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
            
 // 결과값 
 (5초 지연 후)
 1
 2
 3
 4
 5

 

✅ 3. timer

 - 좀 더 강력한 타이머를 원한다면 Observable.timer(_:period:scheduler:) 연산자를 사용할 수 있어요. 이 연산자는 앞서 설명한 Observable.interval(_:scheduler:) 과 아주 유사하지만 몇가지 차이점이 있어요.

  • 구독과 첫번째 값 방출 사이에서 "마감일"을 설정할수 있어요.
  • 반복기간은 옵셔널이다. 만약 반복기간을 설정하지 않으면 타이머 observable은 한번만 방출된 뒤 완료될 것이에요!!

 

        print(" ===== timer ===== " )
        _ = Observable<Int>
            .timer(3, scheduler: MainScheduler.instance)
            .flatMap { _ in
                Observable.of(1,2,3,4,5)
                    .delay(.seconds(Int(3)), scheduler: MainScheduler.instance)
            }
            .subscribe(onNext:{ print("timer -> \($0)") })
            .disposed(by: disposeBag)
            
// 결과값
timer -> 1
timer -> 2
timer -> 3
timer -> 4
timer -> 5

코드를 보면 쉽게 이해할 수 있어.

❗️ 근데 여기서 발견한게 시간 지연하는 오퍼레이터들은 future subscirbe에도 영향을 미친다는 사실이다.!

 

✅ 4. timeout

 - timeout연산자의 주된 목적은 타이머를 시간초과(오류) 조건에 대해 구별하는 것이다.

따라서 timeout 연산자가 실행되면, RxError.TimeoutError라는 에러이벤트를 방출해요. 만약 에러가 잡히지 않으면 sequence를 완전히 종료해요.

        print(" ===== timeOut ===== ")
        Observable.of(1,2,3,4,5)
            .timeout(.seconds(3), scheduler: MainScheduler.instance)
            .subscribe(onNext: { print("timeout -> \($0)") })
            .disposed(by: disposeBag)
        
        
// 결과값
timeout -> 1
timeout -> 2
timeout -> 3
timeout -> 4
timeout -> 5

여기 코드에서는 에러날 일이 없지만, 버튼을 탭하는 이벤트의 경우 n초 안에 이벤트가 나타나지 않으면 시간초과로 에러 발생시켜서 stop event로 만들어 버린다.

 

 

이건 요정도로 알아보도록 하겠다.

왜냐하면 서브젝트를 활용하여 이전 이벤트를 몽땅 받을 수도 있고, replay할 수 있는 방법도 많을 뿐더러, SOPT 커리큘럼이 플레이그라운드 기반이라, 적용되지 않는 메소드도 존재하여서 여기서 마치겠다.

'apple > RxSwift, ReactorKit' 카테고리의 다른 글

🐉 RxSwift + MVVM (TableView) 코드1  (2) 2021.07.15
🐉 RxSwift(Relay와 subject)  (0) 2021.07.12
[week6] Combining Observables  (0) 2021.07.11
[week5] 🌟Transforming Observables  (0) 2021.07.10
[week4] Filtering Observables  (0) 2021.07.10