[RxSwift] RxSwift를 공부해보자 (1)

Erick·2023년 3월 1일
0

RxSwift

목록 보기
1/3
post-thumbnail

[RxSwift] RxSwift를 공부해보자 (1)


이번에 MVVM을 공부하며 그리고 이전에 Swift로 앱 개발을 할 때도 많이 들었던 RxSwift! 그래서 RxSwift는 무엇일까요?

RxSwift란?

RxSwift를 알기 이전에 Swift 앞에 붙는 Rx가 무엇인지 알아야 합니다.
Rx는 ReactiveX의 줄임말입니다.

ReactiveX는 관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 구성하기 위한 라이브러리입니다.

즉 RxSwift는 Swift로 비동기 및 이벤트 기반 프로그래밍을 쉽게 해주기 위한 라이브러리입니다.

우린 지금까지 Apple에서 제공해 주는 여러 가지 방법으로 비동기 처리를 해왔습니다.

  • NotificationCenter
  • Delegate Pattern
  • GCD(Grand Central Dispatch)
  • Closure

하지만 이런 여러 API들로 복합적인 비동기 코드를 나누어 처리하고, 어떤 코드가 언제 실행되는지 알 수 없기 때문에 외부요인에 따라 실행되는 순서가 생각했던 것과는 다르게 실행될 수도 있습니다.
그래서 여러 API를 복합적으로 사용하는 것이 아닌 RxSwift를 사용하여 비동기 처리를 보다 쉽게 해줄 수 있습니다.

Observable

Observable은 관찰 가능한이라는 뜻을 가지고 있습니다.
RxSwift에서는 Observer가 Observable을 구독하고 관찰 가능한 항목에 반응을 합니다.

Observable은 다음 3가지 이벤트를 방출합니다.

  • Next: 어떤 항목을 배출합니다.
  • Error: 항목을 배출하는 도중 에러가 발생하면 에러를 배출하고 종료됩니다.
  • Complete: 성공적으로 Next를 수행했다면 스트림을 종료합니다.

Error, Complete가 호출되면 Dispose가 호출되어 스트림이 종료됩니다.
구독의 생명 주기 마지막엔 항상 Dispose가 호출됩니다.

postObservable = Observable<String>.create { observer in 
    // "A"라는 항목을 배출
    observer.onNext("A")
    observer.onCompleted()
    //Completed된다면 Disposable 리턴
    return Disposables.create()
}

postObservable
	// postObservable를 구독
	.subscribe( event in
    // event 별로 나누어 처리
    switch event {
    .next(let val):
    	print(val)
    .error(let err): 
    	print(err)
    .completed: 
    	print("Completed")
    }
    onDisposed: { print("Disposed") }
).disposed(by: disposeBag)

// "A"
// Completed
// Disposed

위 코드는 문자 "A"를 데이터로 전달하는 postObservable를 생성하고, postObservable를 구독하여 데이터를 받고 처리하는 코드입니다.
성공했을 때는 "A"(데이터), Completed, Disposed가 출력되고 error 발생 시에는 error와 Disposed가 출력됩니다.

Operator

Operator는 말 그래도 Observable의 생성, 병합 등 여러 가지 연산을 도와주는 연산자입니다.

가장 기본적인 just, map, filter에 대해 설명하겠습니다.

just

Observable의 불필요한 과정 없이 데이터에 대한 Observable을 생성하고 구독할 수 있습니다.

Observable.just("Hello World")
	.subscribe(onNext: {
		print($0)
	})
	.disposed(by: disposeBag)
    
// "Hello World"

from

배열 내에 값을 순차적으로 배출합니다.

Observable.from(["Hello", "World", "Rxswift"])
	.subscribe(onNext: {
		print($0)
	})
	.disposed(by: disposeBag)
    
// "Hello"
// "World"
// "Rxswift"

map

map은 익숙한 함수이죠?
데이터를 조건에 따라 변환하는 연산자입니다.

Observable.just("Hello")
	.map { "\($0) World" }
	.subscribe(onNext: { str in
		print($0)
	})
	.disposed(by: disposeBag)

// "Hellow World"

filter

데이터를 조건에 따라 걸러주는 연산자입니다.

Observable.from([1, 3, 5, 7])
	.filter { $0 >= 5 }
	.subscribe(onNext: {
		print($0)
	})
	.disposed(by: disposeBag)
    
// 5
// 7

ReactiveX에서 더 많은 연산자를 확인할 수 있습니다.

Scheduler

Scheduler는 Observable 또는 연산자가 특정 스케줄러에서 작동하도록 지시할 수 있습니다.
우리가 기존에 사용하던 DispatchQueue와 같은 개념이지만, 실제 사용은 훨씬 간편합니다.

Observable.just("5")
		// 병렬비동기 스레드의 스케줄러
		.observeOn(ConcurrentDispatchQueueScheduler(qos: .default))
  		// "12.7"
		.map { "\(Double($0)!*Double(2.54))" }
		// "12.7cm"
  		.map { "\($0)cm" }
  		// View 관련 코드는 메인 스레드에서 실행
  		.observeOn(MainScheduler.instance)
		.subscribe(onNext: {
			self.label.text = $0
		})
		.disposed(by: disposeBag)

마치며

프로젝트를 진행 중에 RxSwift에 적응하기 어려워, 내용을 정리하면 좀 편할까라는 마음으로 간단히 RxSwift에 기본적인 내용에 대해 정리해 봤습니다.
RxSwift에 대해 새롭게 공부하거나 정리가 필요하다고 느끼는 것들을 지속적으로 정리하여 포스팅하겠습니다.

profile
iOS Developer

0개의 댓글