[RxSwift] Observable

잡담

원래.. 어제 올렸어야 했는데, 생각보다 내용이 많기도 하고 컨디션이 좋지 않아서 그냥 잤습니다 ㅎㅎ 죄송합니다 ㅜㅜ

목표가 RxSwift 한 챕터 공부하고, 알고리즘 문제 2개 푸는 거였는데 어제는 지키지 못했네요 ㅎㅎ

학습한 내용

1. Observable 이란?

저는 이게 단어 뜻 그대로 관찰 가능한? 그런 의미인줄 알았는데, observable = observable sequence = sequence 라고하네요.

뭔가 관찰자 느낌보단 흐름(?)에 대한 느낌인거 같아요 이 모든 것들이 비동기적이라는 겁니다.

Observable 들은 일정 기간 동안 계속해서 이벤트를 생성하며, 이러한 과정을 보통 emitting(방출)이라고 표현한다.

Observable은 이벤트를 생성하고 방출해주는 중간다리??

여기서의 표현은 이벤트를 생성한다고 하는데, 음.. 이벤트를 관찰하다가 발생하면 방출하는 느낌이 더 맞지않나 싶은데.. 잘 모르겠네요

2. just

 example(of: "just, of, from") {
     // 1
     let one = 1
     let two = 2
     let three = 3
     
     //2
     let observable:Observable<Int> = Observable<Int>.just(one)
 }

간단하게 말하자면 just는 Observable sequence에 요소 하나를 던져준 느낌이라고 보시면 될 것 같아요

3. of

 let observable2 = Observable.of(one, two, three)

just가 하나만 넣어줬다면, of는 여러 개를 순차적으로 Observable sequence에 넣어 줍니다.

그렇지만 Observable2의 타입은 Observable 입니다. 배열처럼 생각할수도 있지만, 각각이 단일요소로 여러 개가 순차적으로 들어갔다고 생각하시면 될 겁니다.

 let observable3 = Observable.of([one, two, three])

이렇게 넣었을 경우, observable3의 타입은 Observable<[Int]> 입니다. 하지만 of 안의 [one, two, three]는 배열 자체를 하나의 단일 요소로 판단합니다.

4. from

 let observable4 = Observable.from([one, two, three])

from 연산자는 배열 요소들을 각각 하나씩 방출한다고 합니다. 배열 안에 있는 요소들을 각각 방출하고 싶으면 of보단 from을 쓰는 것도 좋은 방법이겠네요.

5. subscribe

이벤트를 방출할 때 쓰는 코드입니다. 음.. observable에 이벤트를 넣어주면, 하나의 sequence로 이벤트가 담겨있는 형태입니다. 아직 이벤트가 방출되지 않은거죠

그래서 이 이벤트를 순차적으로 방출해서 처리해주는 코드가 subscribe 입니다.

스크린샷 2020-12-30 오후 3 31 13

이 그림을 보시면, 이렇게 담겨있다가 subscribe하면 하나씩 방출되는 느낌이라고 보시면 될 것 같아요

6. empty

좀 당황스러운데, 설명을 보고 이런게 왜 필요하지..? 라는 생각이 들었습니다.

요소가 담겨있지 않은 Observable을 만들겠다는 소린데 도대체 왜??

여기서 용도에 대해서도 말씀해주셨는데요

  • 즉시 종료할 수 있는 Observable을 리턴하고 싶을 때
  • 의도적으로 0개의 값을 가지는 Observable을 리턴하고 싶을 때

이렇게 2가지가 있는데, 음.. 저런게 필요할 때가 있나 싶네요.. 지금까진 그렇긴한데 나중에 필요할지는 잘 모르겠습니다.

7. never

이렇게 never라는 연산자도 잇는데,

 let observable = Observable<Any>.never()

이런식으로 선언해주고 observable을 subscribe하면 onNext나 completed도 동작하지 않는다고하네요..

음.. 사실 이것도 아직은 왜 필요한지 모르겠습니다. 개발하다보면 필요한 순간이 생기겠죠??

8. range()

 let observable = Observable<Int>.range(start: 1, count: 10)

1 ~ 10까지의 값을 Observable에 넣어준다고 하네요.. 흠.. 배열로 하나하나 적어서 of나 from으로 넣어주는 것보단 스마트한 방법이겠네요!

9. Disposing

구독이 있다면, 구독 취소도 있어야겠죠?ㅋㅋㅋ 유튜브 구독(Subscribe)해서 유튜버가 올리는 게시글(이벤트)를 바로바로 볼 수 있잔아요?

그런데 반대로 구독 취소(Dispose)하면 게시글(이벤트)을 바로바로 볼 수 없게 됩니다. 이해하기 쉽게 설명해봤는데, 어떤가요??

그냥 딱 구독 취소라고 생각하시면 될 것 같습니다. 구독 취소를 하게 되면 이벤트 방출은 정지된다고 합니다.

10. DisposeBag

각각의 구독에 대해서 일일히 관리하는 것은 효율적이지 못하기 때문에, RxSwift에서 제공하는 DisposedBag 타입을 이용할 수 있다.

음.. 구독취소를 한 명이 관리해주는 느낌이라고 보면 될 것 같네요..

 example(of: "DisposeBag") {
     
     // 1
     let disposeBag = DisposeBag()
     
     // 2
     Observable.of("A", "B", "C")
         .subscribe{ // 3
             print($0)
         }
         .disposed(by: disposeBag) // 4
 }

이런 식으로 가방에 담아주는 것 같습니다.

마침 이쯤에서 저도.. 이런 귀찮은 짓을 왜 하는건지 의문점이 들었는데, 마침 여기서 적절한 타이밍에 말씀해주시네요 ㅋㅋㅋ

이걸 안해주면 메모리 누수가 난다고 합니다 ㅎㅎ 그런데 걱정말래요 까먹고 안해줘도 경고 날려줄거라고 하네요 ㅋㅋㅋㅋ

11. create

Observable을 직접 생성하는 방법도 있는데요

Observable<String>.create({ (observer) -> Disposable in
         // 1
         observer.onNext("1")
         
         // 2
         observer.onCompleted()
         
         // 3
         observer.onNext("?")
         
         // 4
         return Disposables.create()
     })

이런 식으로 생성하고, 이벤트에 대한 부분을 설정해준 뒤, Disposable을 리턴해주면 됩니다.

completed 이후에 있는 ?는 출력되지 않습니다.

12. deferred

상황에 따라 다른 이벤트를 줄 수 있는 방법도 있는데요

 example(of: "deferred") {
     let disposeBag = DisposeBag()
     
     // 1
     var flip = false
     
     // 2
     let factory: Observable<Int> = Observable.deferred{
         
         // 3
         flip = !flip
         
         // 4
         if flip {
             return Observable.of(1,2,3)
         } else {
             return Observable.of(4,5,6)
         }
     }
     
     for _ in 0...3 {
         factory.subscribe(onNext: {
             print($0, terminator: "")
         })
             .disposed(by: disposeBag)
         
         print()
     }
 }

flip의 값이 계속 바뀌면서 1,2,3 과 4,5,6이 번갈아가면서 나오게 됩니다.

소감

제가 다루지 않은 내용들도 있는데, 자세한 내용은 링크를 참고해주시면 감사하겠습니다!

아직 초보 블로거라 정리하는게 쉽지 않네요.. 지금은 최대한 제가 어려웠던 점이나 몰랐던 부분에 대해 서술하려고 노력하고 있습니다.

원래 계획은 하루에 챕터 하나씩 공부할려고 했는데, 쉽지 않네요.. 시간은 하루에 최대 2시간만 쓸려고 합니다. 너무 부족한 것 같아요

하.. 1월이 지나고 그때도 제가 백수라면.. 시간을 더 늘려볼 계획입니다. 😭

화이팅!