- Observer(관찰자)의 관찰 대상이 된다. (= Observer는 Observable을 구독한다.)
- Subscribe(구독)를 통해 변화를 감지할 수 있다.
- Event Sequence를 비동기적으로 생성한다.
- string, int 등 모든 타입(generic)을 반환한다.
💡 Sequence란?
: 한번에 하나씩 단계별로 진행할 수 있는 값 목록
- next
: 새로운 항목들을 배출할 때마다 호출하며, Observable이 배출하는 항목을 파라미터로 받는다.- complete
: Observable이 마지막 next를 호출한 뒤에 호출한다. (complete 호출 후 자동으로 구독 종료(dispose))- error
: 기대하는 데이터가 생성되지 않았거나 오류가 발생할 경우, error를 알리기 위해 호출한다. (error 호출 후 자동으로 구독 종료(dispose))
: 직접 Observer 메서드를 호출하여 Observable을 생성한다.
// 실행 코드
let observable = Observable.create { observer -> Disposable in
observer.on(.next(1))
observer.on(.next(2))
observer.on(.next(3))
.
.
.
observer.on(.next(n))
observer.on(.completed)
return Disposables.create {
print("disposed")
}
}
observable.subscribe {
print($0)
}
// 결과
next(1)
next(2)
next(3)
.
.
.
next(n)
completed
disposed
- Hot Observable
: 생성되자 마자 항목들을 배출하는 Observable
→ 해당 Observable을 구독하는 Observer들은 어떤 경우에는 항목들이 배출되는 중간부터 Observable을 구독할 수 있다.- Cold Observable
: 구독되기 전까지 항목을 배출하지 않는 Observable
→ 해당 Observable을 구독하는 Observer들은 Observable이 배출하는 항목 전체를 구독할 수 있도록 보장받는다.
- 구성요소로 next, complete, error를 가지고 있는 Observable에게 Event를 받아 Observer에게 전달하는 역할을 한다.
- return 타입은 Disposable이다.
Observable.subscribe(onNext: { (event) in
// 필요한 연산을 처리한다.
}, onError: {
// 실패한 호출에 대응한다.
}, onCompleted: {
// 최종 응답 후 정리 작업을 한다.
}, onDisposed : {
// dispose 후 처리 작업을 한다.
})
- 구독하고 있는 Observable을 종료하기 위한 역할을 한다.
- 구독을 종료함으로써 메모리를 효율적으로 관리한다.
: protocol type으로 dispose() func을 가진다.
public protocol Disposable {
func dispose()
}
Observable<String>.create { observer in
observer.onNext("A")
observer.onCompleted() // 완료시점
observer.onNext("?") // 이전에 완료되었기 때문에 출력 x
return Disposables.create() // dispose 생성
}.subscribe(onNext: {
print($0)
}, onError: {
print($0)
}, onCompleted: {
print("completed")
}, onDisposed: {
print("disposed")
})
.disposed(by: disposeBag)
A
completed
disposed
- 하나 또는 여러 개의 Disposable을 관리하는 역할을 한다.
- 일종의 Disposable을 담아두는 가방이다.
- Observer들의 구독을 적절한 때에 모두 dispose할 경우에 쓰인다.
// 실행코드
let disposeBag = DisposeBag()
Observable.of("A", "B", "C")
.subscribe {
print($0)
}.disposed(by: disposeBag)
// 결과
next(A)
next(B)
next(C)
completed
🏷 https://reactivex.io/documentation/ko/observable.html
🏷 https://www.udemy.com/course/mastering-rxswift-in-ios/
🏷 https://zeddios.tistory.com/1340
🏷 https://42kchoi.tistory.com/311?category=975878
🏷 https://ntomios.tistory.com/10
🏷 https://pixabay.com
💥 공부를 위한 정리글이기 때문에 잘못된 부분이 있을 수 있습니다. 💥