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 이벤트를 전달하지 않는다는 것이다.