티스토리 뷰

iOS/RxSwift

[RxSwift] RxSwift는 뭔가?

HarryJeonn 2022. 11. 14. 12:59

RxSwift에 대해 다시 복습해보자!

RxSwift 란?

관찰 가능한 연속성(순차적)형태와 함수형태의 연산자를 이용해서 비동기&이벤트를 위한 코드로 구성하고 있는 라이브러리

그동안 사용하던 cocoa코드에 결정적이고 비동기적인 방법을 이용하여 이벤트에 반응할 수 있도록 함

비동기 프로그래밍이 필요한 순간들

버튼을 눌렀을 때 반응

텍스트필드에 포커스가 잡힌 경우

인터넷에서 크기가 큰 이미지 파일을 받는 경우

HTTP 통신(네트워크 통신)을 하는 경우

디스크에 데이터를 저장하는 경우

오디오를 실행하는 경우

UIKit을 통해 비동기를 사용했던 순간 사용했던 것

NotificationCenter - 백그라운드 진입 후 몇 초 있다가 메시지 알림

Delegate Pattern - TableView의 didSelectRowAt 등 과 같은 메소드

GCD - Serial Queue에서 순차적으로 실행되도록 코드를 예약하거나 우선 순위가 다른 여러 Queue에서 동시에 많은 수의 작업을 실행할 수 있다.

Closure

왜 RxSwift를 사용하는가?

장점

반응형 패러다임이 제공하는 명확함, 비동기를 동기화 코드처럼 작성 가능

일관성 없는 비동기 코드를 하나의 비동기 코드로 개발이 가능

  • 여기서는 NotificationCenter, 저기서는 Delegate, 다른데서는 Closure (물론 용도와 상황에 맞게 사용한다. 예시일 뿐)

확장 불가능한 아키텍처 패턴을 해결

  • 일관성 없는 비동기 코드를 작성하게 되어 서로 다르게 구현한 로직을 조합하거나 확장하기에 어려운 부분을 해결

콜백 지옥에서 벗어나기 좋음

  • UI 이벤트, 네트워크 처리 및 데이터 갱신 등에서 콜백 지옥이나 이벤트 등록 후 추적, 스레드를 넘나들면서 작업했던 것을 RxSwift를 이용하여 해결할 수 있다.

가독성 향상

다양하고 편리한 Operator들이 제공됨

단점

러닝 커브

  • 학습하기가 어렵다.

디버깅이 어렵다

  • 디버깅하면서 추적할 때 어디서 구독을 하는지나 노하우가 쌓이면 되지 않을까..

많은 클로저

  • 클로저의 사용이 많다.
  • 캡쳐 리스트를 사용하여 메모리 누수를 일으키는 부분, 순환참조를 피할 수 있게 신경써야한다.
  • 캡쳐 리스트를 사용하지 않는다면 race condition 같은 것이 발생할 수 있다.

경쟁 상태(race condition)란 공유자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있다.

RxSwift의 필요성

명시적으로 공유된 mutable state를 알기 위함

State - 컴퓨터를 오랫동안 켜놓으면 꺼질 수 있지만 SW, HW는 처음과 같은상태 → State를 바뀌게 한 것은 메모리

따라서 위에서 명시적으로 공유된 state는 메모리라고 할 수 있음

Imperative Programming(명시적 코드)의 한계 극복

명시적 코드 - 일반적으로 짰던 프로그램 방식 run(), getInstance()와 같은 컴퓨터에게 알려주는 프로그램

사람이 명시적 코드를 통해 비동기적 앱을 구현할 때 어려움이 따름

Side Effects를 통해 state 파악

connectUIControls()는 event Handler를 UI 구성요소에 연결한다. View의 state가 변경되면 Side Effect가 발생한다.

Side Effect가 나쁜 것은 아니지만 컨트롤이 가능해야한다.

각 코드에 어떤 코드가 Side Effect를 일으키는지, 단순히 데이터를 처리하고 출력하는지 알 수 있어야 한다.

Declarative Code(선언적 코드)

명령형 프로그래밍에서는 원하는대로 상태를 변경한다.

함수형 프로그래밍에서는 Side Effect를 발생시킬 수 없다.

RxSwift는 명령형 프로그래밍과 함수형 프로그래밍 결합하여 동작하게 한다.

Reactive System(반응형 시스템)

  • Responsive(반응)
    • 항상 가장 최신의 State를 표시하며, UI를 최신 상태로 유지한다.
  • Resilient(복원력)
    • 각각의 행동은 고유하게 정의되며 에러 복구를 위해 유연하게 제공한다.
  • Elastic(탄력성)
    • 코드는 다양한 작업 부하를 처리한다. (데이터 수집, 리소스 공유 등)
  • Message driven(메시지 기반)
    • 구성 요소는 메시지 기반 통신을 사용하여 재사용 및 고유 기능을 개선하고, 라이프 사이클과 클래스 구현을 분리한다.

Rx의 3요소

Observable

데이터의 스냅샷을 전달할 수 있는 이벤트 시퀀스를 비동기적으로 생성하는 기능

Observable을 통해 값을 배출할 수 있고, 이 값을 관찰하고 반응한다.

하나 이상의 관찰자(Observer)가 실시간으로 어떤 이벤트에 반응하고 UI를 업데이트하거나 들어오는 데이터를 처리하고 활용할 수 있게 한다.

Operator

비동기 입력을 받아 출력만 생성하기 때문에 쉽게 결합 가능하다.

Observable이 방출한 값에 Operator를 적용할 수 있다.

UIDevice.rx.orientation
	.filter { $0 != .landscape }
	.map { _ in
		return "portrait 입니다."
	}
	.subscribe(onNext: { msg in
		print(msg)
	})

Observable이 방출한 값에

filter로 landscape이 아닌 것만 통과

map으로 “portrait 입니다.”로 변환

subscribe으로 이벤트 구현 (print문 출력)

Schedulers

Scheduler는 DispatchQueue와 같다. 다만 훨씬 쉽고 강력하다.

RxSwift에는 여러 Scheduler가 정의되어 있어서 개발자가 따로 자신의 Scheduler를 생성할 일이 드물다.

RxCocoa

UIKit 및 Cocoa개발을 지원하는 클래스

다양한 UI 구성요소에 대한 반응형 확장기능을 추가하여 UI 이벤트를 추가 가능

// RxCocoa에서 버튼 이벤트
button.rx.tap.bind {
	print("Tap")
}

button.rx.tap.subscribe(onNext: { _ in
	print("Tap")
})
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함