본문 바로가기

난 iOS개발자/RxSwift

[RxSwift] Observable

728x90

객체에 이벤트/값 등을 추가 - 방출(emit) 가능

Observable을 구독(subscribe)하는 대상에게 이벤트를 방출한다.

Observable은 Sequence와 같다.

 

 

Observable Event의 3종류

  • Next: 구독자에게 이벤트를 전달
  • Completion: 구독자에게 완료를 알리고 Stream이 종료된다.
  • Error: 구독자에게 에러를 알리고 Stream이 종료된다.

 

 

Observable의 생성

Observable<String>.create ( { observer -> Disposable in
	observer.onNext("1")
	observer.complete()
	observer.onNext("2")
	return Disposable.create()
}).disposed(by: disposebag)


/*
print 1
print complete
*/

 

 

Observable 구독하기

생성된 Observable은 이벤트를 방출한다. 구독은 방출하는 이벤트를 받아보는것이다.

 

let observable = Observable<String>.create ( { observer -> Disposable in
	observer.onNext("1")
	observer.complete()
	observer.onNext("2")
	return Disposable.create()
}).disposed(by: disposebag)


observable.subscribe { element in
	print(element)
}

Observable을 구독할때 사용하는 subscribe는 반환타입이 Disposable이다.

나중에 설명하겠지만, dispose는 stream 을 종료하고 메모리릭을 피하게 해준다.

 

 

 

OnNext 

next요소만 처리한다는 의미, 위 코드에서 onNext("1")과 같은 방식으로 방출한 정보를 받을 수 있다.

Complete이나 Error는 다른 클로저로 받는다.

.subscribe(onNext: { element in
	
}).disposed(by: disposeBag)

 

 

DisposeBag

disposable을 담는 가방이다. 뷰컨트롤러 기준으로본다면 뷰컨트롤러가 disposeBag을 지니고 있고,

subscribe에 대한 반환값들을 disposeBag에 담는다. disposeBag은 화면을 빠져나가는것 처럼 뷰컨트롤러가 메모리에서 해제될때 

담겨져있던 disposable들에 대해서 dispose 하여 메모리를 다시 확보하고 stream 을 종료시켜서 오류발생을 막는다.

final class ViewController: UIViewController {
	let disposeBag = DisposeBag()    
    func bind() {
    	viewModel.output.someObserver
        	.subscribe(onNext: { element in 
            
            }
            .disposed(by:disposeBag)
    }
}

 

중첩된 Observable은 아래와 같이 한다더라.

fetchSomeList의 반환값이 Disposable 일때 이를 dispose하기 위해서는 disposeBag에 약한 참조로 접근해야하는데, 

아래처럼 감싸는 Observable이 dispose될 때 내부 subscribe도 dispose되도록 하게 만들자.

Observable.create { observer in
	let disposable = service.fetchSomeList()
    	.subscribe {
        	//~~
        }
    	
        return Disposables.create {
        	disposable.dispose()
        }
}.disposed(by: disposeBag)

 

 

 

Trait

Observable은 맞는데, 그 의미를 명확히 했다.

 

Trait의 종류

  • Single: 성공이냐 실패냐 따지는 일에 적합하다. 
  • Completable: value값을 방출하지 않고, 작업이 제대로 처리되었는지만 확인할때 사용한다.
  • Maybe: Single + Completable

 

Single

Single<T>.create { single in
	single(.success(value))
    single(.error(someError))
    return Disposables.create()
}

 

Completable

// Single과 유사

Completable(.complete)
Completable(.error(value))

 

728x90