RxSwift Observable 알아보기
2022. 5. 12. 23:43ㆍRxSwift
반응형
RxSwift Observable
Observable이란?
- 일정 기간 동안 계속해서 비동기적 이벤트를 생성(emit)
- 비동기적(asynchronous)
- Observable = Observable Sequence = Sequence
Observable 생명주기
- Observable은 어떤 구성요소를 가지는 next 이벤트를 계속해서 방출할 수 있다.
- Observable은 error 이벤트를 방출하여 완전 종료될 수 있다.
- Observable은 completed 이벤트를 방출하여 완전 종료 될 수 있다.
- marble diagram : 시간의 흐름에 따라서 값을 표시하는 방식
- next 이벤트
- completed 이벤트
- error 이벤트
/// Represents a sequence event.
///
/// Sequence grammar:
/// **next\* (error | completed)**
public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
- 위 예제에서 next 이벤트는 어떠한 Element 인스턴스를 가지고 있는걸 확인할 수 있습니다.
- error 이벤트는 Swift.Error 이벤트를 가지고 있습니다.
- completed 이벤트는 아무런 인스턴스를 가지고 있지 않고 단순히 이벤트를 종료시키는 이벤트 입니다.
Observable 실습
- just
Observable<Int>.just(1) // 하나의 Element만 방출하는 Observable 생성 Oparator입니다.
.subscribe(onNext: {
print($0)
})
// Observable은 실제로는 Sequence 정의 일뿐 Subscribe(구독)되기 전에는 아무런 이벤트도 내보내지 않습니다.
// 확인을 할려면 반드시 subscribe를 해줘야 한다.
- of
print("-----Of1-----")
Observable<Int>.of(1, 2, 3, 4, 5) // 다양한 형태의 이벤트들을 넣을 수 있습니다.
print("-----Of2-----")
Observable.of([1, 2, 3, 4, 5]) // 타입추론을 통해서 Observable Sequence를 생성
- from
Observable.from([1, 2, 3, 4, 5])
// Array형태의 값만 받는다. 자동적으로 자기가 받은 Array속에 있는 Element들을 하나씩 꺼내서 방출하게 된다.
Subscribe
- Observable은 실제로는 Sequence 정의 일뿐 Subscribe(구독)되기 전에는 아무런 이벤트도 내보내지 않습니다. 확인을 할려면 반드시 subscribe를 해줘야 한다.
// Subscribe1
Observable.of(1, 2, 3)
.subscribe {
print($0)
}
// .subscribe만 이용하면 어떤 이벤트에 어떠한 값이 씌워져서 나오고 completed 이벤트가 발생했는지 여부를 확인해줌
// Subscribe2
Observable.of(1, 2, 3)
.subscribe {
if let element = $0.element {
print(element)
}
}
// Subscribe3
Observable.of(1, 2, 3)
.subscribe(onNext: {
print($0)
})
empty
- 요소를 하나도 가지지 않은 어떤 카운트 0인 Observable을 만들때 혹은 즉시 종료하고 싶은 Observable을 만들고 싶을때 사용한다.
Observable.empty()
.subscribe {
print($0)
}
never
- 작동은 하지만 아무것도 내보내지 않는 연산자입니다.
- 확인을 하고싶으면 .debug 연산자를 사용해야 합니다.
Observable.never()
.debug("never") // 2022-05-20 02:13:39.901: never -> subscribed
.subscribe(
onNext: {
print($0)
},
onCompleted: {
print("완료")
})
range
- start 값부터 count를 하나씩 늘려가면서 Observable Sequence를 생성한다.
// range
Observable.range(start: 1, count: 9)
.subscribe(onNext: {
print("3*\($0)=\(3*$0)")
})
dispose
- 구독을 취소하여 Observable을 종료시킵니다.
// dispose : 구독 취소
Observable.of(1, 2, 3)
.subscribe {
print($0)
}
.dispose()
disposeBag
- 방출된 리턴값을 disposeBag에 호출한다. Observable에 대해서 구독을 하고 있을 때 이것을 즉시 disposeBag에 추가한다. disposeBag은 이것을 가지고 있다가 자신이 할당 해제할때 모든 구독에 대해서 dispose를 날린다.
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.subscribe {
print($0)
}
.disposed(by: disposeBag)
create
- Observable에서 직접 이벤트 방출
// create
Observable.create { observable -> Disposable in
observable.onNext(1)
// observable.on(.next(1)) // 같은 표현
observable.onCompleted()
observable.onNext(2) // onCompleted 이벤트 때문에 이벤트가 방출되지 않음
return Disposables.create()
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
// create2
enum MyError: Error {
case anError
}
Observable<Int>.create { observable -> Disposable in
observable.onNext(1)
observable.onError(MyError.anError)
observable.onCompleted()
observable.onNext(2)
return Disposables.create()
}
.subscribe(
onNext: {
print($0)
},
onError: {
print($0.localizedDescription)
},
onCompleted: {
print("완료")
},
onDisposed: {
print("disposed")
}
)
.disposed(by: disposeBag)
deffered
- subscribe를 기다리는 observable을 만드는 대신에 각 subscribe에 새롭게 observable을 제공하는 observable factory를 만드는 방식
// deffered
Observable.deferred {
Observable.of(1, 2, 3)
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
// deffered 2
var 뒤집기: Bool = false
let factory: Observable<String> = Observable.deferred {
뒤집기 = !뒤집기
if 뒤집기 {
return Observable.of("👍")
} else {
return Observable.of("👎")
}
}
for _ in 0...3 {
factory.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
}
반응형
'RxSwift' 카테고리의 다른 글
RxSwift Filtering Operator (0) | 2022.05.17 |
---|---|
RxSwift Subject 알아보기 (0) | 2022.05.16 |
RxSwift Single, Maybe, Completable 알아보기 (0) | 2022.05.15 |
RxSwift 설치하기 (0) | 2022.05.11 |
RxSwift 알아보기 (0) | 2022.05.10 |