RxSwift 공부합시다앙아아아아아앙아아

한담곰·2024년 10월 28일

쏘의 Swift_Study

목록 보기
10/15

해당 글의 원문: 김종권의 iOS 앱 개발 알아가기

(따라 작성하면서 공부했습니다... 따라 쓰면서 공부하는 걸 좋아해요 ^,.^)

1. RxSwift

관찰 가능한 연속성(순차적)형태와 함수 형태의 연산자를 이용해서 비동기&이벤트를 위한 코드로 구성하고 있는 라이브러리 (스케줄러를 통해 parameterized된 실행들을 가능하도록 함)
그동한 사용하던 Cocoa 코드에 결정적이고 비동기적인 방법을 이용하여 이벤트에 반응할 수 있도록 함

ex) 비동기 프로그래밍이 필요한 순간들
(1) 버튼을 눌렀을 때의 반응
(2) TextField에 포커스가 잡힌 경우
(3) 인터넷에서 크기가 큰 이미지 파일을 받는 경우
(4) 디스크에 데이터를 저장하는 경우
(50 오디오를 실행하는 경우

ex) iOS 프로그래밍에서 UIKit을 통해 비동기를 사용했던 순간
(1) NotificationCenter: 백그라운드 진입 후 몇 초 있다가 메시지 알림
(2) The Delegate Pattern: TableView의 didSelectRowAt과 같은 메소드
(3) Closure

2. Rxswift 사용하는 이유

2-1. RxSwift 없이 비동기적인 측면에 접근한다면?

  • 비동기 실행 코드를 이해하기 힘듦: 애플의 API에서 제공하는 delegate 패턴을 그대로 사용할 뿐이지, 그 코드 자체는 속에 내장되어 있음
  • 비동기 실행에 관한 명확한 추론하기 힘듦.
  • ex) 값을 예측하기 힘듦: 버튼 클릭 이벤트가 몇 번 발생했는지 모름 -> currentIndex의 값을 코드 상에서 확인하기 힘듦
var array = [1, 2, 3]
var currentIndex = 0

@IBAction func printNext(_ sender: Any) {
	print(arrya[currentIndex])
    if currentIndex != array.count -1 {
    	currentIndex += 1
    }
}

2-2. MVVM과 밀접한 연관

  • MVVM은 데이터 바인딩을 제공하는 플랫폼에서 만들어진 이벤트 중심 프로그램을 위해 특별히 개발되었는데, RxSwift는 이와 연관성이 높음.

3. RxSwift의 필요성

(1) 명시적으로 공유된 mutable state를 알기 위함
state: 컴퓨터를 오랫동안 켜 놓으면 꺼질 수 있지만, S/W와 H/W는 처음과 같은 상태 -> state를 바뀌게 한 것은 memory 따라서! 위 예에서 명시적으로 공유된 state는 memory라고 할 수 있음.

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

  • 명시적 코드: 일반적으로 짰던 프로그램 방식 run(), getInstance()와 같은 컴퓨터에게 알려 주는 프로그램
  • 사람이 명시적 코드를 통해 비동기적 앱을 구현할 때 어려움이 따름
override func viewDidAppear(_ animated: Bool) {
	super.viewDidAppear(animated)

    setupUI()
    connectUIControls()
    createDataSource()
    listenForChanges()
}

위의 코드 같은 경우, 순서를 조금 바꾼다면 전혀 다른 메소드가 될 수 있음 (비동기적인 어려움)

(3) Side Effects를 통해 State 파악

  • Side Effects는 코드의 현재 흐름에 대한 state를 표현 (위 코드에서 connectUIControls()가 실행되기 전에 Side Effects를 발생시켜서 정보를 알 수 있게 함)
  • Side Effects가 발생한다면, 그 메소드가 실행되기 전의 작업을 직접 지정해 줄 수 있는 장점

(4) Declarative Code(선언적 코드)

  • 절차지향 프로그램과 함수형 프로그램의 균형성을 갖춘 형태가 RxSwift. 선언적 코드는 이벤트가 일어날 때 그 데이터에 대한 처리가 가능하며, for loop와 같은 작업 역시도 가능.
  • 절차지향 프로그램은 마음대로 상태를 변경하며, 함수형 프로그램은 side effect를 최소하는 코드를 지향.

(5) Reactive System

  • Responsive: 언제나 UI를 최신 상태로 유지
  • Resilient(탄력이 있는): 각 Behavior들은 독립적이고 에러가 발생할 때 회복에 유연한 탄력적 특성
  • Elastic(유연한): 다양한 wordload를 처리 (데이터 모음, 자원 공유 등)
  • Message Driven: 컴포넌트들은 메시지 기반으로 상호작용하므로 재사용성의 장점과 LifeCycle과 클래스의 구현을 분리

4. Rx의 3요소

(1) Observables< Data >

  • 객체에 이벤트나 값 추가, 수정 등과 같은 것을 가능하게끔 해 줌.
  • event 종류: next event, completed event, error event

(2) Operators

  • 마치 연산자와 같이 비동기들은 highly decoupled and composable
  • 옵저버에서 나온 결과를 Rx 연산자를 통해 입력 및 출력이 가능 -> Side Effect 발생 가능

(3) Schedulers
DispatchQueue와 기능 동일

5. RxCocoa

(1) 개념

  • UIKit 및 Cocoa 개발을 지원하는 클래스를 보유하고 있는 RxSwift 동반 라이브러리
  • 다양한 UI 구성 요소에 대한 반응형 확장 기능을 추가하여 UI 이벤트 추가 기능
profile
iOS Developer

0개의 댓글