RxSwift 는 Observables를 잘 활용하고 편리하게 다루기 위해
다양한 Operators들을 제공한다.
Operators가 너무 많기 때문에 타입별로 자주 사용하게 될 것 같은걸 몇개씩만 정리해보려고 한다.
모든 내용은 아래의 공식 Docs에 있으니 첨부한다.
//Create
//가장 기본적인 생성 메서드로 아래와 같은 예시로 Observable을 생성 가능하다.
Observable.create() { emitter in
//아래와 같이 데이터를 발생
emitter.onNext("Something")
return Disposables.create()
}
//Just
//단일의 이벤트를 방생시켜,
//간결하게 한개만 데이터를 넣고 싶을 때 사용
Observable.just("just one")
//From
//한번에 여러개의 이벤트를 전달한다. ex) 배열 등
Observable.from([1, 2, 3])
발생되는 이벤트의 값을 변경시켜주는 Operators
let numberOb = Observable<Int>.just(10)
//이벤트 값을 String으로 변경해줌
let stringMap = numberOb.map { String($0) }
stringMap.subscribe(onNext: { event in
// event는 String으로 내려오게 됨
print(event)
}).disposed(by: disposeBag)
발생하는 이벤트들을 선택적으로 발생시키는 Operators
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9 10]
Observable.from(numbers)
.filter{ $0.isMultiple(of: 2) }
.subscribe { print($0) }
//2의 배수만 필터가 되어 아래와 같이 출력된다.
//next(2)
//next(4)
//next(6)
//next(8)
//next(10)
한개 이상의 Observable을 한개의 Observable로
//추후 다룰 내용이지만 아직 값이 없는 Observable 형태
let subject1 = PublishSubject()
let subject2 = PublishSubject()
//of 연산자는 여러개의 값/Observable을 받을 수 있는 생성 연산자
Observable.of(subject1, subject2)
//받아진 Observable을 merge로 결합
.merge()
.subscribe {
print($0)
}
subject1.on(.Next(10))
subject1.on(.Next(11))
subject1.on(.Completed)
subject2.on(.Next(22))
subject2.on(.Completed)
//아래와 같이 차례대로 수행됨
Next(10)
Next(11)
Next(22)
Completed
do try catch와 비슷하며,
Observable가 error로 끝나지 않고 Observable<> 타입을 반환한다.
let observable = Observable<Int>
.create { observer -> Disposable in
observer.onNext(1)
observer.onNext(2)
observer.onError(NSError(domain: "", code: 100, userInfo: nil))
observer.onError(NSError(domain: "", code: 200, userInfo: nil))
return Disposables.create { }
}
observable
//에러가 발생하면 NSError.code의 이벤트를 발생시킨다.
.catchError { .just(($0 as NSError).code) }
.subscribe { print($0) }
.disposed(by: disposeBag)
/* Prints:
next(1)
next(2)
next(100)
next(200)
completed
*/
Observable이 배출하는 모든 값을 연산하여 이벤트를 발생시키는 연산자.
//reduce
//Swift의 Reduce와 동일해 별다른 설명은 생략하며, 예시로 확인한다.
Observable.of(1,2,3,4,5).reduce(0,accumulator: +)
.subscribe(onNext: {
print($0)
})
//모든 값을 더 해 이벤트를 발생
//retrun 15
RxSwift에서는 다양한 연산자를 제공하며 최소한으로 몇가지만 정리를 해보았다.
물론 공식 docs를 확인하면 수 많은 것들이 있으며, Rx를 사용하면서 때에 필요한 연산자를 찾아 사용하면서 익힐 수 있도록 해야한다.
이번 정리에서는 이런 연산자들이 있으며, 다음부터는 있을 것 같은? 느낌이 들거나 있으면 편하겠다는 생각이 들 때 그때그때 공부하도록 하면 될 듯 하다.