RxSwift에서 생성 옵저버블에 대해서 정리해보려고 합니다.
1. Create
Create는 직접적인 코드 구현을 통해 옵저버 메서드를 호출하여 옵저버블을 생성합니다.
- 구현부
public static func create(_ subscribe: @escaping (RxSwift.AnyObserver<Self.Element>) -> RxSwift.Disposable) -> RxSwift.Observable<Self.Element>
subscribe 파라미터는 AnyObserver를 가져와 Disposable을 반환하는 이스케이프 클로저입니다.
- 예제
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)
// print
A
Completed
Disposed
2. Defer
Defer는 옵저버가 구독하기 전까지 옵저버블 생성을 지연하고 구독이 시작되면 옵저버 별로 새로운 옵저버블을 생성합니다.
- 구현부
public static func deferred(_ observableFactory: @escaping () throws -> RxSwift.Observable<Self.Element>) -> RxSwift.Observable<Self.Element>
- 예제
let a = ["a", "a"]
let b = ["b", "b"]
var flag = true
let observable: Observable<String> = Observable.deferred {
flag = !flag
if flag {
return Observable.from(a)
} else {
return Observable.from(b)
}
}
observable
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
a
a
completed
observable
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
b
b
completed
3. Just
Just는 하나의 항목을 방출하는 옵저버블을 생성합니다.
- 구현부
public static func just(_ element: Self.Element) -> RxSwift.Observable<Self.Element>
- 예제
let disposeBag = DisposeBag()
// 1)
Observable.just(1)
.subscribe { event in print(event) }
.disposed(by: disposedBag)
// print
next(1)
completed
// 2)
Observable.just([1, 2, 3])
.subscribe { event in print(event) }
.disposed(by: disposedBag)
// print
next([1, 2, 3])
completed
4. of
두 개 이상의 요소를 방출하는 옵저버블을 생성합니다.
- 구현부
public static func of(_ elements: Self.Element..., scheduler: RxSwift.ImmediateSchedulerType = CurrentThreadScheduler.instance) -> RxSwift.Observable<Self.Element>
- 예제
Observable.of(1, 2, 3)
.subscribe { element in print(element) }
.disposed(by: disposedBag)
// print
next(1)
next(2)
next(3)
completed
5. from
배열에 포함된 요소를 하나씩 순서대로 방출하는 옵저버블을 생성합니다.
- 구현부
public static func from(_ array: [Self.Element], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> RxSwift.Observable<Self.Element>
- 예제
Observable.from([1,2,3])
.subscribe{ element in print(element) }
.disposed(by: disposeBag)
// print
next(1)
next(2)
next(3)
completed
6.range
연속된 범위(Range)의 정수를 발행하는 옵저버블을 생성합니다.
증가되는 크기를 바꾸거나 감소하는 시퀀스를 생성하는 것은 불가능합니다. (그러기 위해서는 7.generate를 사용해야합니다)
- 구현부
public static func range(start: Element, count: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element>
- 예제
Observable.range(start: 1, count: 10)
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
next(1)
next(2)
..
next(10)
7.generate
- 구현부
public static func generate(initialState: Element, condition: @escaping (Element) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (Element) throws -> Element) -> Observable<Element>
initialState: 시작 값(가장 먼저 방출되는 값)
condition: 조건이 true일 경우에만 요소가 방출됨 (false일 경우 completed)
iterate: 값을 증가시키거나 감소시킬 경우 사용
- 예제
Observable.generate(initialState: 0, condition: { $0 <= 10 }, iterate: { $0 + 2 })
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
next(0)
next(2)
next(4)
next(6)
next(8)
next(10)
completed
8.repeatElement
특정 요소를 반복적으로 방출하는 옵저버블을 생성합니다.
- 구현부
public static func repeatElement(_ element: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element>
- 예제
Observable.repeatElement("A")
//.take(7) // 7개만 방출하고 종료
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
"A"
...
무한루프
9. empty, never, throw
요소를 방출하지 않고 정확하고 제한된 행동을 하는 옵저버블을 생성합니다.
1) empty : 항목은 없지만 정상적으로 종료되는 옵저버블
- 구현부
public static func empty() -> RxSwift.Observable<Self.Element>
- 예제
Observable<Void>.empty()
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
completed
2) never : 항목을 방출하지 않고 종료하지 않는 옵저버블
- 구현부
public static func never() -> RxSwift.Observable<Self.Element>
- 예제
Observable<Void>.empty()
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
never는 complete 호출되지 않음.
3) error : 항목을 방출하지 않고 오류로 종료되는 옵저버블
- 구현부
public static func error(_ error: Error) -> RxSwift.Observable<Self.Element>
- 예제
enum MyError: Error {
case error
}
Observable<Void>.error(MyError.error)
.subscribe { print($0) }
.disposed(by: disposeBag)
// print
error(error)
'RxSwift' 카테고리의 다른 글
[RxSwift] Subject 정리 (1) | 2020.05.24 |
---|---|
[RxSwift] 옵저버블(Observable)이란? (1) | 2020.05.16 |
RxSwift란 (0) | 2020.05.16 |
RxSwift Summary 카테고리 포스트 계획 (0) | 2020.05.16 |