just
just(_:)는 생성된 이벤트를 바로 전달하고 completed 된다.
let observable = Observable.just(5)
observable.subscribe { print($0) } // next(5) -> completed
observable.subscribe { print($0) } // next(5) -> completed
let observable2 = Observable.just([1, 2, 3, 4, 5])
observable2.subscribe { print("Array \($0)") } // Array next([1, 2, 3, 4, 5]) -> Array completed
of
만약 2개 이상의 이벤트를 전달해야 하는 경우 of(_:) 연산자를 사용한다.
let observable = Observable.of("ㄱ", "ㄴ", "ㄷ")
observable.subscribe { print($0) } // next(ㄱ) -> next(ㄴ) -> next(ㄷ) -> completed
let observable2 = Observable.of([1, 2], [3, 4], [5, 6])
observable2.subscribe { print($0) } // next([1, 2]) -> next([3, 4]) -> next([5, 6]) -> completed
from
of(_:) 연산자와 다르게 배열의 값을 하나씩 전달해야하는 경우 사용한다.
of(_:) 연산자는 통째로 주기 때문에 하나씩 전달해야하는 경우에 적합하다.
결과를 보면 바로 차이를 알 수 있다.
let intArray = [1, 2, 3, 4, 5]
let ofObservable = Observable.of(intArray)
ofObservable.subscribe { print($0) } // next([1, 2, 3, 4, 5]) -> completed
let fromObservable = Observable.from(intArray)
fromObservable.subscribe { print($0) } // next(1) -> next(2) -> next(3) -> next(4) -> next(5) -> completed
range
정수를 지정된 수만큼 방출하는 경우에 사용한다. 시작값에서 정해진 수만큼 1씩 증가하고, 증가값을 조절하거나 빼는 것은 불가능하다. 즉 무조건 시작값에서 정해진 수만큼 1씩 증가하는 것만 된다. 또한 시작값으로는 무조건 정수여야 한다.
let rangeObservable = Observable.range(start: 3, count: 2)
rangeObservable.subscribe { print($0) } // next(3) -> next(4) -> completed
generate
range(start:count:) 연산자와 다르게 시작값에서 증가값을 조절하거나 빼는 등 추가적인 조작이 가능하다.
또 시작값으로 정수뿐 아니라 문자열이나 실수 등 다양한 값이 가능하다.
let generateObservable = Observable.generate(initialState: 0, // 시작값
condition: { $0 <= 3 }, // false가 되면 completed 이벤트와 함께 종료
iterate: { $0 + 1 }) // 값을 변환하는 코드
generateObservable.subscribe { print($0) } // next(0) -> next(1) -> next(2) -> next(3) -> completed
let generateObservable2 = Observable.generate(initialState: 1.5,
condition: { $0 <= 4.5 },
iterate: { $0 + 1.5 })
generateObservable2.subscribe { print($0) } // next(1.5) -> next(3.0) -> next(4.5) -> completed
repeatElement
repeatElement(_:) 연산자는 지정된 값을 무한정으로 방출한다.
무한 루프이기 때문에 take(_:) 연산자를 통해 지정된 수만큼 방출하도록 만들 수 있다.
let repeatObservable = Observable.repeatElement("RxSwift")
repeatObservable.subscribe { print($0) } // next(RxSwift)...
repeatObservable
.take(5)
.subscribe { print($0) } // next(RxSwift) *5 -> completed
deferred
특정 조건에 따라 Observable을 생성한다.
var bool = false
let deferreddObservable: Observable<Bool> = Observable.deferred {
if !bool {
bool.toggle()
}
return Observable.just(bool)
}
deferreddObservable.subscribe { print($0) } // next(true) -> completed
create
Observable을 직접 구현해야 하는 경우에 사용한다.
Observable을 종료하기 위해서는 꼭 onError(_:) 혹은 onCompleted()를 작성해야만 한다.
그리고 클로져의 리턴 타입은 Disposable 이지만 실제로는 꼭 Disposables.create()를 사용해야 한다.
enum CustomError: Error {
case castingError
}
let createObservable: Observable<Int> = Observable.create { (observable) -> Disposable in
let value = "6"
guard let intValue = Int(value) else {
observable.onError(CustomError.castingError)
return Disposables.create()
}
observable.onNext(intValue)
observable.onCompleted()
return Disposables.create()
}
createObservable.subscribe{ print($0) } // next(6) -> completed
let createObservable2: Observable<Int> = Observable.create { (observable) -> Disposable in
let value = "R"
guard let intValue = Int(value) else {
observable.onError(CustomError.castingError)
return Disposables.create()
}
observable.onNext(intValue)
observable.onCompleted()
return Disposables.create()
}
createObservable2.subscribe{ print($0) } // error(castingError)
empty
empty() 연산자는 아무런 이벤트를 전달하지 않는다.
구독이 발생해도 그저 completed 이벤트만 전달한다.
let emptyObservable = Observable<Void>.empty()
emptyObservable.subscribe { print($0) } // completed
error
error(_:) 연산자도 empty() 연산자처럼 아무런 이벤트를 전달하지 않고 바로 error 이벤트만 전달한다.
let errorObservable = Observable<Void>.error(MyError.error)
errorObservable.subscribe { print($0) } // error(error)
empty()와 error(_:) 모두 중요한 것은 아무런 next 이벤트를 전달하지 않는다는 것이다.