728x90
1. RxSwift 또는 Reactive Extension의 히스토리 (Functional Reactive Programming: FRP)
1997
- 1997년 Functional Reactive Animation을 만들기 위해 개념이 고안됨
- animation을 DSL 언어로 설명하고자 하는 목표가 있었음
- animation의 움직임을 벡터화 하여 렌더링 타임에 샘플링을 완료할 수 있는 성능을 가짐 (60images/second)
- 예시는 jonaschapuis.com/wp-content/uploads/2017/09/ReactiveProgrammingOriginsAndEcosystem.pdf 슬라이드 참조
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 swapping: the replacement or addition of components to a computer system without stopping, shutting down, or rebooting the system
2013
- 넷플릭스에서 Reactive Extension을 JVM에 이식하여 RxJava 탄생
- 이식의 타겟을 Java가 아닌 JVM으로 하면서 JVM 기반의 Scala, Groovy등에도 Rx를 사용할 수 있는 가능성이 열림
2015
- Reactive Stream 표준 제정
- Netflix, Pivotal 및 Lightbend의 엔지니어 간의 발의로 시작됨
- non-blocking, back pressure을 이용한 비동기 서비스를 할 때 기본이 되는 스펙
2015
2. RxSwift은 무엇인가🧐
헷갈리는 개념들🤬 용어정리🤜
Reactive Programming != Rx
* 패러다임: 이 시대를 살아가고 있는 사람이 공통적으로 생각하는 관점
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)
- [패러다임] 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...
- RxCocoa:
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 |
댓글