반응형 프로그래밍 패턴에 따라 코드를 작성하는 데 도움을 준다.
RxSwift는 Swift 에서 Rx를 구현한 라이브러리이고,
RxCocoa는 UIKit과 Cocoa 프레임워크 기반 개발을 지원 라이브러리이다.
Rx는 변화할 수 있는 상태에 쉽게 대처할수있고,
이벤트들의 순서의 구성과, 코드분리, 재사용성 등을 향상시킬 수 있다.
Observable 클래스는 여러 이벤트를 생성할 수 있는 대상을 의미한다.
최신 / 다음 데이터를 전달하는 이벤트
구성요소를 계속해서 방출할 수 있다.
성공적으로 일련의 이벤트들을 종료시키는 이벤트
Observable이 성공적으로 자신의 생명주기를 완료했으며,
추가적으로 이벤트를 생성하지 않는다.
Observable이 에러를 발생했으며,
추가적으로 이벤트를 생성하지않고, 완전 종료하는 이벤트
_ = API download(file: "https://fastcampus.co.kr...")
.subscribe(onNext: { data ini
// Append data to temporary file
},
onError: { error in
// Display error to user
},
onCompleted: {
// Use downladed file
})
ObservableType 과 Observable 클래스에는
복잡한 논리를 구현하기 위해 많은 메소드가 포함되어있다.
➡️ Operator
Operator 는 비동기 입력을 받아 출력만 생성하므로
Operator 끼리 쉽게 혼합해서 사용가능하다.
RxOperator 들은 Observable 에 의해 들어온 값들을 처리하고
최종 값이 나올 때 방출한다.
🔥 just
특정 Observable 을 하나만 간단하고 쉽게 생성할 수 있다.
Observable.just("RxSwift")
.subscribe(onNext: { data in
print(data)
}).disposed(by: disposeBag)
// RxSwift
🔥 from
just
는 한 번에 모든 결과를 방출하는 반면,
from
은 결과를 하나씩 방출한다.
Observable.from(["Rx", "Swift"])
.subscribe(onNext: { data in
print(data)
}).disposed(by: disposeBag)
// Rx
// Swift
🔥 of
from
은 배열만 받는 반면,
of
는 배열 뿐만 아니라 각각의 값을 받을 수 있다.
Observable.of("Rx", "Swift")
.subscribe(onNext: { data in
print(data)
}).disposed(by: disposeBag)
// Rx
// Swift
🌈 map
방출한 결과를 원하는대로 변형해서 방출시킬 수 있다.
Observable.just("RxSwift")
.map{ $0.count }
.subscribe(onNext: { data in
print(data)
}).disposed(by: disposeBag)
// 7
🌈 flatMap
방출된 이벤트로부터 새로운 Observable 로 변형하여 방출한다.
let sequenceInt = Observable.of(1, 2)
let sequenceString = Observable.of("A", "B")
sequenceInt
.flatMap{ (num: Int) -> Observable<String> in
print("Int Item: \(num)")
return sequenceString
}.subscribe(onNext: { str in
print("String Item: \(str)")
}).disposed(by: disposeBag)
// Int Item: 1
// String Item: A
// Int Item: 2
// String Item: B
🌈 flatMapLatest
기본적으로 flatMap
과 동일하게 작동하지만 가장 최신의 값만을 다룰 수 있다.
🌌 filter
방출된 이벤트 중 조건에 맞는 이벤트만을 방출한다.
Observable.from([1, 2, 3, 4, 5])
.filter { $0 % 2 == 0 }
.subscribe(onNext: { data in
print(data)
}).disposed(by: disposeBag)
// 2
// 4
🌌 take
처음으로 들어오는 n 개의 이벤트만 방출한다.
Observable.of(1, 2, 3, 4, 5, 6)
.take(3)
.subscribe(onNext: { data in
print(data)
}).disposed(by: disposeBag)
// 1
// 2
// 3
🌌 skip
처음으로 방출되는 n 개의 이벤트는 방출하지 않고, 이후부터 방출한다.
🌌 distinctUntilChanged
연속으로 동일한 값이 방출되지 않도록 한다.
Observable.of(1, 1, 1, 2, 3, 4)
.distinctUntilChanged()
.subscribe(onNext: { data in
print(data)
}).disposed(by: disposeBag)
// 1
// 2
// 3
// 4
🌌 throttle
지정된 시간동안 처음 들어오는 이벤트를 방출한다.
latest
라는 변수의 값에 따라 이벤트를 다르게 방출한다.
false
인 경우, 처음에 들어온 이벤트만 방출하며,
true
인 경우에는 처음과 마지막 이벤트를 방출한다.
🌌 debounce
지정한 시간동안 들어온 이벤트 중, 가장 최신의 이벤트를 방출한다.
💥 merge
여러 개의 Observable 을 합치지만, 하나의 이벤트를 받을 수 있다.
공통의 로직을 실행해야하는 경우 사용하면 유용하다.
let observable1 = Observable.of(1, 2, 3)
let observable2 = Observable.of(4, 5, 6)
Observable.merge(observable1, observable2)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
// 1
// 4
// 2
// 5
// 3
// 6
💥 combineLatest
두 개 이상의 Observable 중,
가장 최근의 이벤트가 방출될 때 이벤트를 전부 방출한다.
둘 중 어느 하나라도 방출하지 않은 Observable 이 있다면 방출하지 않는다.
💥 zip
두 개 이상의 Observable 중,
이벤트를 방출하면 순서가 맞은 쌍기리 하나의 이벤트를 방출한다.
Rx에서 dispatch queue와 동일하며, 훨씬 강력하고 사용하기 쉽다.
RxSwift에는 여러가지의 스케줄러가 이미 정의되어 있으며,
개발자가 새롭게 스케줄러를 정의해서 사용하는 일은 거의 없다.
mainThread 에서 실행되어야 할 작업을 처리한다.
현재 있는 Thread 에서 작업을 처리한다.
특정한 dispatch_queue_t
에서 실행되어야 할 작업을 처리한다.
특정한 ispatch_queue_t
에서 실행되어야 할 작업을 처리한다.
보통 백그라운드 작업을 처리할 때 사용한다.
NSOperationQueue에서 실행되어야 할 작업을 처리한다.
📚 Reference
ReactiveX/RxSwift
RxMarbles