카테고리 없음

RxSwift) Observable과 Observer

ScutiUY 2020. 11. 17. 18:24

Observable

RxSwift에서 가장 중요한 키워드

observable: 관찰 가능한 (객체) 

Observable은 Event를 전달하는 객체

 

observer는 observable을 감시하고 있다가 전달되는 event를 처리

observer가 observable을 감시하는 것을 subscribe 라고 부름.

따라서 observer는 subscriber가 된다.

 

observable이 발생 시키는 세 가지 event

 

- Next: 발생하는 새로운 이벤트를 Next 이벤트를 통해 전달. 이벤트에 값이 들어 있다면 Next 이벤트와 함께 전달한다.

이 행위를 방출 이라고 표현. Emission

 

- Erorr: 에러

- Complete: 완료

두 이벤트는 observable 라이프 사이클의 가장 마지막에 호출되며, 이벤트가 호출 되면 더 이상의 이벤트는 호출되지 않는다.

Emission이 아닌 Notification이라고 불린다.

 

observable 생성하기

- create 연산자

Observable을 create 연산자를 통해 생성한다.

아래 observable의 내용은 구독 하고 있는 observer에게 0과 1을 next 이벤트를 통해 전달한다.

completed 이벤트를 전달하여 끝을 알린다.

// 
// Observable<Type>.create(<#T##subscribe: (AnyObserver<_>) -> Disposable##(AnyObserver<_>) -> Disposable#>
//

Observable<Int>.create { (observer) -> Disposable in
    observer.on(.next(0))
    observer.onNext(1)
    
    observer.onCompleted()
    return Disposables.create()
}

 

- from 연산자

from 연산자는 파라미터로 전달하는 배열의 요소를 순서대로 방출하고 completed 이벤트(종료)를 전달하는 observable을 생성한다. 

Observable.from([0, 1])

 

여기까진 observable이 생성 되기만 한 상태이다.

다시 말해 정수가 방출 되거나 이벤트가 전달되지 않는다.

'observable은 단순히 전달 하는 이벤트의 순서와 내용을 정의한 것이다.'

 

Subscribe

위의 observable에서 observer로 이벤트가 전달 되는 시점은 subscribe를 할 때이다.

이벤트가 전달 되는 시점 = observer가 observable을 subscribe 하는 시점

구독 시점에 next 이벤트를 통해 내용을 방출하고 completed 이벤트가 호출 되며 종료된다.

 

observer가 observable을 구독하는 방법

 

subscribe 메소드 호출

생성한 observable에 subscripe 메소드(연산자)를 사용하여 observable과 observer를 연결한다.

 

// 위의 observable을 상수에 저장하여 사용한다.

let o1 = Observable<Int>.create { (observer) -> Disposable in
	obsever.on(.next(0))
	observer.onNext(1)
    
    observer.onCompleted()
    
    return Disposables.create()
}

//subscribe 메소드 
//[observable 객체].subscribe { observer }

o1.subscribe {  // 이 closure가 observer
    print($0)  
} 
// next(0)
// next(1)
// completed

//하나의 observer를 하나의 클로저에서 처리 하는 메소드 형식
o1.subscribe {
    if let element = $0.element {
        print(element)
    }
}
// 0
// 1

//하나의 observer를 원하는 별도의 이벤트를 통해 처리하는 방식
//[observable 객체].subscribe(onNext: ((Int) -> Void)?, onError: ((Error) -> Void)?, onCompleted: (() -> Void)?, onDisposed: (() -> Void)?)
//사용하지 않을 파라미터는 삭제하고 사용 가능하다.
//closure 파라미터로 next에 저장된 요소가 바로 전달된다.
o1.subscribe(onNext: {
    print($0)
})
// 0
// 1

 

이벤트 처리 규칙

 

observer는 동시에 2개 이상의 이벤트를 처리하지 않는다. = observable은 observer가 하나의 이벤트를 처리 후 그 다음 이벤트를 전달 한다.  

결론

observable은 단순히 observer에게 어떤 내용(이벤트)을 전달 할지 정의 해놓은 객체이다.

observable은 observer가 observable을 subscribe 하는 시점에 전달 된다.