늘 헷갈렸던 건데, 이번에 배워서 까먹을 때마다 보려고 정리해 둔다.
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 |
---|