[RxSwift] Observable

Posted by Sung Kyungmo on October 26, 2019

Observable

Observable은 Observable Sequence, Sequence라고 부르기도 한다.

Observable이 이벤트를 방출하는것을 emit한다고 표현한다

Observable의 생명주기


  • Observable은 어떤 구성요소(값)를 가지는 next 이벤트를 방출(Emission)할 수 있다.
  • Observable은 error 이벤트를 방출(Notification)하여 완전 종료될 수 있다.
  • Observable은 complete 이벤트를 방출(Notification)하여 완전 종료 될 수 있다.
  • error, complete는 가장 마지막에 전달된다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public enum Event<Element> {
     /// Next elemet is produced.
     case next(Element)
       
     /// Sequence terminated with an error.
     case error(Swift.Error)
       
     /// Sequence completed successfully.
     case completed
    }
    

    Observable 생성


  • just: 하나의 단일이벤트를 방출하는 옵져버블 생성
1
2
3
4
let observable = Observable.just(1)

// next(1)
// completed
  • of: 순차적으로 이벤트를 방출하는 옵져버블 생성
1
2
3
4
5
6
let observable = Observable.of(1, 2, 3)

// next(1)
// next(2)
// next(3)
// completed
1
2
3
4
let observable = Observable.of([1, 2, 3])

// next([1, 2, 3])
// completed
  • from: 배열 요소들을 순차적으로 방출하는 옵져버블 생성
1
2
3
4
5
6
let observable = Observable.from([1, 2, 3])

// next(1)
// next(2)
// next(3)
// completed
  • create는 직접 onNext, onComplete, onError를 직접 호출해야 함

Observable 구독


Observable은 정의일뿐 구독자(subscriber)가 구독(subscribe)을 하기 전까지는 아무런 이벤트도 전달하지 않는다

1
2
3
observable.subscribe(onNext: { (element) in
    print(element)
})

Disposing과 종료


Completed, Error로 종료되면 리소스가 자동 해제된다.

직접 리소스를 해제시키고 종료하려면 dispose()를 호출하면 된다.

DisposedBag을 사용하여 여러개의 Disposable을 한꺼번에 관리하고 할당해제할 수 있다.

1
2
3
4
5
6
7
var disposeBag = DisposeBag()

Observable.from([1, 2, 3])
    .subscribe {
        print($0)
    }
    .disposed(by:disposeBag)


Reference


http://reactivex.io/
https://kxcoding.com/