본문 바로가기
iOS/RxSwift

RxSwift background knowledge

by HaningYa 2021. 3. 25.
728x90

 

1. RxSwift 또는 Reactive Extension의 히스토리 (Functional Reactive Programming: FRP)

https://jonaschapuis.com/wp-content/uploads/2017/09/ReactiveProgrammingOriginsAndEcosystem.pdf

 

1997

2009

에릭마이어가 FRP개념을 바탕으로 MS .NET의 Reactive Extension을 개발

2012

  • Elm 이라는 언어를 통해서 확장 
  • web app 을 위한 DSL 언어
  • Singnal 이라는 컨셉 도입
    • 시간에 따른 무한한 값들의 시퀀스(또는 이벤트)
    • Signal들은 history를 가짐
    • 변수가 바뀌는게 아닌 전부 이벤트로 처리
    • Signal들은 transform과 함께 합쳐서 하나의 program flow를 설명함
    • Signal을 나타내는 그래프는 정적임(static)
      -> pipe는 런타임에 달라질 수 없고 이 특징이 "deterministic program" 을 가능하게 했음
      -> 그래서 time-travel 과 hot-swapping 이 가능함

      *Time-travel programming: programming language support for interacting with past executions
      *
      Hot swappingthe replacement or addition of components to a computer system without stopping, shutting down, or rebooting the system

https://jonaschapuis.com/wp-content/uploads/2017/09/ReactiveProgrammingOriginsAndEcosystem.pdf
https://jonaschapuis.com/wp-content/uploads/2017/09/ReactiveProgrammingOriginsAndEcosystem.pdf
https://jonaschapuis.com/wp-content/uploads/2017/09/ReactiveProgrammingOriginsAndEcosystem.pdf
https://jonaschapuis.com/wp-content/uploads/2017/09/ReactiveProgrammingOriginsAndEcosystem.pdf

2013

  • 넷플릭스에서 Reactive Extension을 JVM에 이식하여 RxJava 탄생
  • 이식의 타겟을 Java가 아닌 JVM으로 하면서 JVM 기반의 Scala, Groovy등에도 Rx를 사용할 수 있는 가능성이 열림

2015

  • Reactive Stream 표준 제정
  • Netflix, Pivotal 및 Lightbend의 엔지니어 간의 발의로 시작됨
  • non-blocking, back pressure을 이용한 비동기 서비스를 할 때 기본이 되는 스펙

https://grokonez.com/java/java-9-flow-api-reactive-streams

2015


2. RxSwift은 무엇인가🧐

헷갈리는 개념들🤬 용어정리🤜

Reactive Programming != Rx

 

Functional Reactive Programming Paradigm

let us: Go! 2017 가을 세미나에서 발표한 내용

iamchiwon.github.io

* 패러다임: 이 시대를 살아가고 있는 사람이 공통적으로 생각하는 관점
1. Low Memory(메모리 최적화) 
2. Mass Production(추상화, 재사용성) 
3. Concurrency(동시에 여러개의 인스턴스 수행 -> 퍼포먼스, 신뢰성 증가)
  • [패러다임] Functional Programmning:
    • 데이터는 immutable 하게 취급
    • 데이터 변경이 필요할 때는 새로 만듦
    • side effect를 없애기 위해 pure function 사용
    • function 들의 composition과 HOF으로 프로그램 개발
    • Data가 아닌 Process에 집중
    • 명령형 프로그래밍과 반대로 선언적이고 어플리케이션의 상태 흐름이 순수 함수를 통해 흐른다.

      *명령형: 데이터를 정의하고 변화 과정을 프로그래밍 할 것인가
      *선언형: 행위를 정의하고 거기 데이터를 집어넣을 것인가

      *순수함수: side effect가 없는 함수, 함수의 실행이 외부에 영향을 끼치지 않는 함수(사용하는 변수를 모두 파라미터로 받는다)
      value type 값들이 너무 많아지지 않는가? -> high memory 시대임, dereference 없어서 빠름
      * immutable data: 변하지 않는 데이터
          --> 순수 함수형 프로그래밍에서는 x = 1 을 2로 바꾸려면 x를 변화시키는게 아닌 새로운 변수를 만들어 버린다.

  • functional programming 에서 Async job을 처리할 때 Concurrent 하게 처리하고 싶다.
    • Callback 을 사용한다.
    • Delegate를 사용한다.
    • Reactive programming으로 처리한다!
  •  [패러다임] Reactive programming: 
    • Async 한 상황에서 Async 한 데이터를 어떻게 처리할 것이냐? 
    • Stream 으로 연결하고 데이터를 Stream에 흘려보내자!
    • 데이터나 이벤트 변화에 반응하는 것에 초점을 맞춘 프로그래밍
    • 구현한 라이브러리들 중 하나가 Rx(Reactive Extension)

Generator 와 Consumer 사이를 Stream으로 연결하고 Operator를 통해 transform 한다

 

  • [패러다임] Reactive (Functional) programming: 
    • Async 한 처리를 Functional 하게 처리하자
    • 리턴값은 Stream인 Observable을 반환하자
    • Stream에 흐르는 Data/Event를 Operator로 처리하자
    • Stream 과 Stream 을 연결하자
    • Data가 아닌 Process에 집중하자
  • RxSwift: Reactive 아이디어를 구현한 Swift 라이브러리

RxSwift 장점

  • Callback hell 에서 벗어날 수 있음
  • Delegate pattern 코드에 비해 가독성이 좋음 (왔다리 갔다리 안해도됨)
  • MVVM 구조와 찰떡궁합
  • Reactive Extension을 지원하는 다른 언어들과 로직 동기화
  • 기타 등등

RxSwift 단점

  • 러닝커브 존재
  • 써드파티 라이브러리 (Combine 에 비해)
  • 언젠간 Combine으로 대체해야 한다,,,?
  • Rx data transformation 을 debugging 하는게 까다로움
    (stream 내부 breakpoint 걸면 4개 이상의 entry backtrace stack 과 여러개의 내부 Rx 메서드가 찍힘)
  • Closure capture list 에 신경써야 한다.
    클로져 사용이 많아서 memory leak 을 일으키는 strong reference cylce을 피할 수 있게 신경써야 한다.
    (??)
  • Swift언어에서 Async/await이 나온다면
    proposal: gist.github.com/oleganza/7342ed829bddd86f740a

성능

source:github.com/ReactiveX/RxSwift/issues/86

  • 적절히 사용하면 성능상 이슈가 발생하지는 않는다.
  • 그나마 heavy 한 작업은 여러개의 sequences를 merge 할때 사용되는 NSRecursiveLocks을 사용할 때이다.
    *NSRecursiveLock 에 관한 자료 medium.com/cashwalk/foundation-nslock-c33213512280

3. iOS에서 사용하는 Rx based library

  • RxSwift:
    • RxCocoa:
      - RxSwift를 기반으로 하는 별도의 라이브러리
      - Cocoa framework에 Reactive library의 장점을 더해준다.
      - rx namespace를 통해 제공된다.
    • RxDataSource
      - RxSwift를 위한 UITableView 와 UICollectionView Datasource
      - 데이터를 Observable sequence로 바꿔줌
      - 데이터가 사용되는 tableView/CollectionView에 bind 해줌
    • RxOptional
      - optional 관련된 operator 제공
      - errorOnNil(), catchOnNil{}, distinctUntilChanged(), etc
    • RxGesture
       - tap, pinch, pan, rotation 등의 gesture를 stream 으로 처리할 수 있게 해줌
    • RxAlamofire
      - Alamofire
    • RxSwiftExt
      - extension
    • RxRealm
      - realm
    • RxAlert
      - alert
    • and so on...

full list here

 

RxSwift Community

RxSwift ecosystem projects. RxSwift Community has 73 repositories available. Follow their code on GitHub.

github.com

728x90

'iOS > RxSwift' 카테고리의 다른 글

RxSwift: Observable & Subject in practice  (0) 2020.07.13
RxSwift: Subjects  (0) 2020.07.10
RxSwift: Observable  (0) 2020.07.09
RxSwift: Hello RxSwift!🖐  (0) 2020.07.08
RxSwift를 사용한 비동기 프로그래밍 #4 [마지막]  (0) 2020.06.03

댓글