[iOS] RxSwift

Eugenie·2022년 8월 13일
0

Rx [ Reactive Extensions (= Reactive X) ]

반응형 프로그래밍 패턴에 따라 코드를 작성하는 데 도움을 준다.

RxSwiftSwift 에서 Rx를 구현한 라이브러리이고,

RxCocoaUIKitCocoa 프레임워크 기반 개발을 지원 라이브러리이다.

Rx는 변화할 수 있는 상태에 쉽게 대처할수있고,
이벤트들의 순서의 구성과, 코드분리, 재사용성 등을 향상시킬 수 있다.

Rx 의 3 요소

🥏 Observable

Observable 클래스는 여러 이벤트를 생성할 수 있는 대상을 의미한다.

next

최신 / 다음 데이터를 전달하는 이벤트

구성요소를 계속해서 방출할 수 있다.

completed

성공적으로 일련의 이벤트들을 종료시키는 이벤트

Observable이 성공적으로 자신의 생명주기를 완료했으며,
추가적으로 이벤트를 생성하지 않는다.

error

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
	})

🥏 Operator

ObservableType 과 Observable 클래스에는
복잡한 논리를 구현하기 위해 많은 메소드가 포함되어있다.

➡️ Operator

Operator 는 비동기 입력을 받아 출력만 생성하므로
Operator 끼리 쉽게 혼합해서 사용가능하다.

RxOperator 들은 Observable 에 의해 들어온 값들을 처리하고
최종 값이 나올 때 방출한다.

Observable 을 생성하는 Operator

🔥 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

방출하는 결과를 변환하는 Operator

🌈 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 과 동일하게 작동하지만 가장 최신의 값만을 다룰 수 있다.

방출하는 필터링 Operator

🌌 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

지정한 시간동안 들어온 이벤트 중, 가장 최신의 이벤트를 방출한다.

Observable 을 합성하는 Operator

💥 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 중,
이벤트를 방출하면 순서가 맞은 쌍기리 하나의 이벤트를 방출한다.

🥏 Schedulers

Rx에서 dispatch queue와 동일하며, 훨씬 강력하고 사용하기 쉽다.

RxSwift에는 여러가지의 스케줄러가 이미 정의되어 있으며,

개발자가 새롭게 스케줄러를 정의해서 사용하는 일은 거의 없다.

MainScheduler

mainThread 에서 실행되어야 할 작업을 처리한다.

CurrentThreadScheduler

현재 있는 Thread 에서 작업을 처리한다.

SerialDispatchQueueScheduler

특정한 dispatch_queue_t 에서 실행되어야 할 작업을 처리한다.

ConcurrentDispatchQueueScheduler

특정한 ispatch_queue_t 에서 실행되어야 할 작업을 처리한다.
보통 백그라운드 작업을 처리할 때 사용한다.

OperationQueueScheduler

NSOperationQueue에서 실행되어야 할 작업을 처리한다.


📚 Reference
ReactiveX/RxSwift
RxMarbles

profile
🌱 iOS developer

0개의 댓글