이벤트를 방출하는 Observable
이벤트를 관찰 및 처리하는 Observer
이 둘을 연결하는 것이 Subscribe
이 둘의 연결을 끊는 것이 Dispose
1. Observable
Observable은 RxSwift에서 시퀀스, 스트림 등으로 불리며, 비동기적으로 이벤트를 방출(emit)하는 시퀀스를 의미한다.
Observable은 시간이 지남에 따라 여러 이벤트를 발생시킬 수 있으며, 각 이벤트는 값을 포함할 수도, 에러 또는 완료를 나타낼 수도 있다.
2. Observable의 이벤트
Observable은 대표적으로 세 가지 이벤트를 방출한다.
- next: 새로운 값을 방출하는 이벤트.
- error: 오류가 발생하여 시퀀스를 종료하는 이벤트.
- completed: 모든 값을 방출한 후 시퀀스를 종료하는 이벤트.
Observable은 next 이벤트로 값을 방출하다가, error 또는 completed 이벤트가 발생하면 종료된다.
종료된 Observable은 더 이상 이벤트를 방출하지 않는다.
또한 error 이벤트와 completed 이벤트 중 하나만 발생하며, 동시에 발생하지 않는다.
3. Observable 생성
Observable은 다양한 방법으로 생성할 수 있다.
- just: 하나의 요소를 포함하는 Observable 생성.
- of: 여러 요소를 포함하는 Observable 생성.
- from: 배열을 개별 요소로 변환하여 Observable 생성.
- create
- defferd
let observable1 = Observable.just(1) // 하나의 요소
let observable2 = Observable.of(1, 2, 3) // 여러 요소
let observable3 = Observable.from([1, 2, 3]) // 배열을 개별 요소로 변환
4. Subscribe - Observable 구독
Observable은 생성하더라도 구독자가 생길 때까지 이벤트를 방출하지 않는다.
subscribe 메서드로 이루어지며, next, error, completed 이벤트에 대한 핸들러를 지정할 수 있다.
let observable = Observable.of(1, 2, 3)
observable.subscribe { event in // 구독
print(event) // 핸들러 지정
}
이 코드는 각각의 next 이벤트와 마지막에 completed 이벤트를 방출한다.
(오류가 발생하지 않기 때문에 error 이벤트는 방출되지 않는다.)
5. Dispose - Observable 구독 해제
구독을 통해 Observable의 이벤트를 수신하지만, 때로는 구독을 명시적으로 해제해야 한다.
dispose 메서드를 호출하여 수행하며, RxSwift는 이를 자동으로 관리하기 위한 DisposeBag을 제공한다.
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.subscribe { event in
print(event)
}
.disposed(by: disposeBag) // 구독 해제
6. Observable 생성자를 이용한 이벤트 직접 정의
create 연산자를 사용하면 Observable이 방출할 이벤트를 직접 정의가 가능하다.
let disposeBag = DisposeBag()
Observable<String>.create { observer in
observer.onNext("A")
observer.onCompleted()
return Disposables.create()
}
.subscribe(
onNext: { print($0) },
onError: { print($0) },
onCompleted: { print("Completed") },
onDisposed: { print("Disposed") }
)
.disposed(by: disposeBag)
위 코드를 실행하게 되면 "A"라는 값을 방출한 후 completed 이벤트를 발생시키고 종료한다.
7. Observable 팩토리 생성하기
deferred 연산자를 사용하면 구독 시점에 새로운 Observable을 생성할 수 있다.
let disposeBag = DisposeBag()
var flip = false
let factory: Observable<Int> = Observable.deferred {
flip.toggle()
return flip ? Observable.of(1, 2, 3) : Observable.of(4, 5, 6)
}
for _ in 0...3 {
factory.subscribe(onNext: { print($0, terminator: "") })
.disposed(by: disposeBag)
print()
}
위 코드는 구독할 때마다 다른 Observable을 반환하여, 123 또는 456의 시퀀스를 번갈아 출력한다.
8. Observer
Observer는 Observable에서 방출하는 이벤트를 받아 처리한다.
즉, Observer는 Observable을 구독하며, 이 구독을 통해 Observable이 방출하는 데이터를 받을 수 있다.
Observer는 데이터의 수신, 오류 처리, 완료 처리 등을 수행합니다.
9. Observer의 이벤트 관찰 및 처리
Observer는 다음과 같은 메서드를 통해 이벤트를 처리한다.
- onNext: Observable에서 새로운 데이터를 방출할 때 호출.
- onError: 오류가 발생했을 때 호출.
- onCompleted: Observable이 더 이상 데이터를 방출하지 않을 때 호출.
'RxSwift' 카테고리의 다른 글
[RxSwift] RxSwift로 키보드가 화면을 가릴 때 해결하기! (0) | 2024.06.27 |
---|---|
[RxSwift] Single (0) | 2024.06.03 |
[RxSwift] Subscribe vs. Bind vs. Drive (0) | 2024.05.31 |
[RxSwift] Driver (0) | 2024.05.31 |
[RxSwift] Subject, Relay (0) | 2024.05.29 |