Observable의 특징과 share

늘 헷갈렸던 건데, 이번에 배워서 까먹을 때마다 보려고 정리해 둔다.

Observable의 주 특징 unicast

네트워크 수업에서 들었던 unicast. 네트워크에서는 프레임을 딱 하나의 목적지로만 보내는 것을 의미하는데, 여기서는 약간 다른 뜻으로 사용된다. Observable을 여러 군데서 subscribe 할 때마다, create를 호출해서 Observable을 새 성한다.

class A {
    func push() -> Observable<Int> {
        return Observable.create { observer in
            observer.onNext(Int.random(in: 1...100))
            return Disposables.create()
        }
    }
}

다음과 같이 랜덤 한 Int값을 내보내는 Observable이 있을 때, 다음과 같이 여러 개의 subscribe가 있다면

let req = A().push()
        
req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)
        
req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)

req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)

//출력:  21
//	56
//     35
//

모두 다른 수가 나온다. 

 

Subject의 주 특징 multicast

Observable의 unicast와 반대인 특징. 여러 subscribe가 존재해도 하나의 스트림만 존재한다. 

let req = BehaviorSubject<Int>(value: 0)
req.onNext(Int.random(in: 1...100))
        
req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)

req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)

req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)

//출력
//57
//57
//57

 

하지만 보통 네트워크 코드를 RxSwift를 짤 때, 우리는 Observable.create를 이용하는데, 여러 subscribe를 하게 되면 네트워크 요청이 여러 번 실행되게 되므로, 이를 해결하기 위한 연산자인 share()이 존재한다.

class A {
    func push() -> Observable<Int> {
        return Observable.create { observer in
            observer.onNext(Int.random(in: 1...100))
            return Disposables.create()
        }.share()
    }
}
let req = A().push()
        
req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)
        
req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)

req.subscribe(with: self) { owner, value in
    print(value)
}.disposed(by: disposeBag)

//출력
//44

share는 Observable의 subscribe개수가 0->1이 될 때만 create를 호출하고(subscription 생성), 그 이후에는 subscribe가 호출된다면, 이미 생성된 subscription을 공유해서 사용하도록 한다.

'iOS > RxSwift' 카테고리의 다른 글

RxSwift) Observable, Subscribe  (0) 2022.08.08