fimuxd/RxSwift를 참고해 정리하는 글입니다 🙂
Observable
을 구독(subscribe)Observable
이 방출(emit)하는 모든 item이나 시퀀스에 반응⇒ 비동기적으로 진행
1) onNext
2) onCompleted
3) onError
public enum Event<Element> {
/// Next elemet is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
Observable의 생명주기
- 생성 - create()
- subscribe() -> subscribe해야 함수 내부가 실행됨
- onNext로 데이터 전달
---끝---- onCompleted로 종료 / 또는 onError로 종료
- Disposed
❗️ 한 번 끝난 observable은 다시 사용할 수 없음, 새롭게 subscribe해줘야 함
let observable:Observable<Int> = Observable<Int>.just(1)
// 1
let one = 1
let two = 2
****let observable2 = Observable.of(one, two, three)
// 1 -> 2 -> 3
from
연산자는 오직 array 만 가능let observable3 = Observable.from([1, 2, 3])
// 1 -> 2 -> 3
empty()
를 통해 completed
만 방출let observable = Observable<Void>.empty()
empty()
와 다르게 onCompleted
조차 방출하지 않음do
를 이용해 처리Observable<Int>.create { observer in
observer.onNext(1)
observer.onCompleted()
return Disposables.create()
}
let observable = Observable.from([1, 2, 3])
observable.subscribe { (event) in
print(event)
}
// next(1)
// next(2)
// next(2)
// completed
next
로 방출하고 최종적으로 completed
방출.subscribe
은 Disposable
을 리턴observable.subscribe { event in
if let element = event.element {
print(element)
}
}
observable.subscribe(onNext: { (element) in
print(element)
})
// 1
// 2
// 3
subscribe(onNext:)
를 이용하면 .next
의 이벤트 값만 받을 수 있다onError
, onCompleted
도 처리subscribe
로 Observable을 구독한다면 dispose
로 구독을 취소// Observable 정의
let observable = Observable.of("A", "B", "C")
// Observable 구독
let subscription = observable.subscribe({ (event) in
// eventt 처리
print(event)
})
// Observable 구독 취소
subscription.dispose(
dispose
한 이후에는 더 이상 방출되지 않음dispose
를 호출해야 completed
됨DisposeBag()
을 활용DisposeBag()
은 disposable
을 담고 있음let disposeBag = DisposeBag() // DisposeBag 생성
Observable.of("A", "B", "C")
.subscribe {
print($0)
}
.disposed(by: disposeBag) // subscribe로 생성된 disposable를 DisposeBag에 담음
DisposeBag
이 할당 해제할 때마다 dispose()
를 호출dispose()
를 해주지 않는다면 메모리 누수가 발생할 수 있음let disposeBag = DisposeBag()
Observable<String>.create({ (emitter) -> Disposable in
// "1" 방출
emitter.onNext("1")
// observer.onError(MyError.anError)
// 종료
emitter.onCompleted()
// ?
emitter.onNext("?")
// Disposable 생성 및 리턴
return Disposables.create()
})
AnyObserver
를 취한 뒤 Disposable
을 리턴AnyObserver
는 generic 타입으로 Observable sequence에 값을 추가할 수 있고 해당 값은 subscriber
에 방출된다onCompleted
로 종료된 이후라 방출되지 않음onError
를 한다면 에러를 통해 종료됨onCompleted
나 onError
로 종료하지 않고 disposeBag에도 넣지 않으면 메모리 낭비가 발생let deferredObservable: Observable<Int> = Observable.deferred {
flip = !flip
if flip {
return Observable.of(1,2,3)
} else {
return Observable.of(4,5,6)
}
}
subscribe
시 flip에 따라서 다른 event를 방출.success(value)
또는 .error
이벤트를 방출.success(value)
= .next
+ .completed
.completed
또는 .error
만을 방출하며, 이 외 어떠한 값도 방출하지 않음Single
+ Completable
success(value)
, .completed
, .error
를 모두 방출