apple/RxSwift, ReactorKit

RxSwift 스터디 2주차 Observable

lgvv 2021. 7. 8. 20:51

RxSwift 스터디 2주차 Observable

 

 

이번주차에는 Observable에 대해서 스터디

 

 

 

(참고링크)

http://reactivex.io/documentation/operators.html

 

ReactiveX - Operators

Introduction Each language-specific implementation of ReactiveX implements a set of operators. Although there is much overlap between implementations, there are also some operators that are only implemented in certain implementations. Also, each implementa

reactivex.io

 

 

 

 

목차

1. Observable이란?

2. Emitting이란?

3. Observabel의 LifeCycle

4. Operator (just, from, empty, never, range)

5. 메모리 누수를 막기위해 DisposeBag() 활용

6. (실습) 버튼 클릭 시에 텍스트 필드에 입력된 정보를 받아오기

 

 

1. Observable이란?

Observable은 다양한 이름으로 불릴 수 있음.

 

옵저버블이 여러 이름으로 불려요!



Emitting 이란?

emitting

 

 

Observabel의 LifeCycle

 

라이프사이클은 매우 중요해서 꼭 숙달하기.

 

라이프 사이클 다시보자!

 

 

 

Operator (just, from) 

오퍼레이터들을 간단히 정리 

 

Creating Observables

  • just : 단일 시퀀스로 내려보내줌
  • from : 하나하나 따로 내려보내줌

이외에도 다른 오퍼레이터들도 존재하는데, 생성에 관여하는 옵저버블.

 

    let stringSequence = Observable.just("this is string yo")
    let oddSequence = Observable.from([1, 3, 5, 7, 9])
    let dictSequence = Observable.from([1:"Rx",2:"Swift"])
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        print("----stringSequence:just---")
        stringSequence.subscribe { (event: Event<String>) in
            print(event)
        }.disposed(by: disposeBag)
        
        print("----oddSequence:from---")
        oddSequence.subscribe { (event: Event<Int>) in
            print(event)
        }.disposed(by: disposeBag)
        
        print("----dictSequence:from---")
        dictSequence.subscribe { (event: Event<(key: Int, value: String)>) in
          print(event)
        }.disposed(by: disposeBag)
        
        
    }

 

위의 코드에 대한 결과

 

 

  • empty: 빈 옵저버블
  • never: 절대 실행되지 않음. (Complete는 적용)
        print(" ===== never ===== ")
        let neverSequence = Observable<String>.never()
        let neverSequenceSubscription = neverSequence
            .subscribe { _ in
                print("This will never be printed")
        }
        neverSequenceSubscription.disposed(by: disposeBag)
        
        print(" ===== empty ===== ")
        Observable<Int>.empty()
            .subscribe { event in
                print(event)
            }
            .disposed(by: disposeBag)

 

결과

위의 코드에 대한 결과

 

 

 

never의 사용 이유

never가 사용되는 이유

 

 

empty의 사용 이유

empty를 사용하는 이유

 

  • range: 범위
  • 마치 for문처럼 사용
        print(" ===== range ===== ")
        Observable.range(start: 1, count: 10)
            .subscribe { print($0) }
            .disposed(by: disposeBag)

range 결과

 

 

메모리 누수를 막기위해 DisposeBag() 활용.

 

RxSwift는 캡처를해서 사용하다 보니까 클로저에서 Copy해서 사용해야 누수가 발생하지 않음.

제일 간단하게 하려면 [weak self]를 사용하여 이를 예방할 수 있음.

 

그리고 disposeBag에 등록해서 관찰하는 스트림들을 모두 놓아주어야 뷰가 해제될 때 메모리 누수가 발생하지 않음

 

 

(실습) 버튼 클릭 시에 텍스트 필드에 입력된 정보를 받아오기

아래는 샘플 코드

override viewDidLoad() {
    button.rx.tap.subscribe(onNext: { [weak self] next in
        guard let self else { return }
        self.myJust(element: self.textField.text ?? "null")
            .subscribe { s in print(s) }
    }).disposed(by: disposeBag)
}

func myJust<E>(element: E) -> Observable<E> {
    return Observable.create { observer in
        observer.on(.next(element))
        observer.on(.completed)
        return Disposables.create()
    }
}