-
RxSwift를 시작하기에 앞서. (Before RxSwift)Ray Wenderlich/RxSwift 2018. 1. 30. 14:45
Before starts RxSwift ~p.31
RxSwift
RxSwift는 비동기 코드, 또는 이벤트 기반 코드 작성에 도움이 되는 라이브러리이다.
Observable Sequence와 함수형 프로그래밍 스타일을 이용한다.
비동기 프로그래밍?
아래 나열한 상황이 동시에 발생할 수 있을 것이다.
-UIButton터치에 반응
- 텍스트 입력을 끝내고 키보드가 사라지는 애니메이션이 진행중
- 인터넷에서 사진을 다운로드 받는 중
- 디스크에 데이터를 저장중
- 오디오 재생중
- 기타 등등
애플에서 제공하는 방법을 통해 이런 비동기작업을 수행하려면 아래와 같은 방법을 이용했을 것이다.
- NotificationCenter
- Delegate 패턴
- GCD
- 클로져
위 방법들을 사용하면 비동기 작업들이 실행되는 순서를 보장할 수 없다.
비동기 작업들이 실행되면서 외부요인에 의해 순서가 바뀔 수도 있기 때문이다.
그 결과, 앱이 외부 환경에 따라 다르게 작동하게 된다. 사용자가 앱을 실행해서 사용할 때마다, 다르게 작동할 수 있다는 말이다.
위방법을 사용해서 좋은 비동기 코드를 작성하는 것이 불가능하다는 것은 아니다.
실제로 애플에서 제공하는 방법들은 좋은 퀄리티를 갖고 있으며, 다른 플랫폼에서 제공하는 방법보다 더 좋다고 생각한다.
문제는 여기에 있다.
애플이 제공하는 방법이 다양하고, 이 방법들을 사용해서 여기저기에 비동기코드를 작성하면 그 뒤에 새로운 코드를 추가하기가 어렵다.
여기선 Delegate를 사용하고, 저기선 클로져를 쓰고, 저기선 또 NotificationCenter를 쓰고.. (사진참조)
비동기코드 관련 코드를 아우르는 하나의 패러다임이 없기 때문에, 전체적인 비동기 코드를 이해하기 힘들어진다.
원문: The issue is that complex asynchronous code becomes very difficult to write in part because of the variety of APIs that Apple’s SDK offers:
1개의 sync 코드, 1개의 async코드를 비교해보자.
Sync code - 이터레이션이 한번에 동기적으로 일어난다.
var array = [1, 2 ,3]
for number in array {
print(number)
array = [4, 5, 6]
}
print(array)
동기적으로 실행되고, 이터레이션하는 동안 컬렉션은 immutable하다.
Async code - 1회의 이터레이션이 1회의 탭에 의해 일어난다.
var array = [1, 2, 3]
var currentIndex = 0
@IBAction fund printNExt(_ sender: Any) {
print(array[currentIndex])
if currentIndex != array.count - 1 {
currentIndex += 1
}
}
탭을 세번 하면 1, 2, 3이 차례대로 나올까? 장담할 수 없을 것이다.
다른 곳에 있는 코드가 array에 접근하여 값이 바뀔 수 있다. array에 값이 늘어날 수도, 삭제될 수도 있을 것이다.
비동기 코드를 작성할 때 발생하는 문제점은 두 가지로 볼 수 있겠다.
- 실행 순서가 보장되지 않는다.
- Mutable 데이터를 공유하고 있다.
이 문제점은 RxSwift의 장점과 딱 맞물린다!!
비동기 프로그래밍!
RxSwift는 비동기, Reactive, 함수형 프로그래밍이 많이 적용되어 있다.
따라서 다음 용어들을 이해하고 있으면 RxSwift를 시작하기 수월할 것이다.
State (Shared mutable state) :
1. Imperative Programming : 명령형 프로그래밍 (<-> Declarative programming)
2. Side effects : 외부 요인으로 인해 현재 State가 변경되는 것을 의미함. 부작용이란 뜻은 아님
3. Declarative code
4. Reactive systems
5. Responsive
1. Resilient
2. Elastic
3. Message driven
Foundation of RxSwift
Rx는 새로운 컨셉이 아니라, 꽤 오래전부터 알려진 컨셉이다. 다만 지난 10년간 Rx의 주요 컨셉이 다시 주목받아온 것이다.
이 기간동안 웹 애플리케이션에는 비동기 프로그래밍, UI와 관련된 많은 문제들이 있었다. 서버단에서도 Reactive 시스템이 필수화 되었다.
마이크로소프트에서는 이 비동기문제들을 해결하기 위해 .NET에 Rx를 적용한 클라이언트/서버사이드 프레임워크를 선보였다.
최근에는 RxJS, RxKotlin, Rx.NET, RxScala RxSwift등 많이 생기게 되었다.
이 모든 라이브러리는 같은 API를 기반으로 작성되었기 때문에, 다른 플랫폼의 개발자들와 Rx에 관련한 로직을 대화하는데 전혀 무리가 없다.
RxSwift finds the sweet spot between traditionally imperative Cocoa code and purist functional code. It allows you o react to events by using immutable code definitions to process asynchronously pieces of input in a deterministic, compassable way.
'Ray Wenderlich > RxSwift' 카테고리의 다른 글
RxSwift - Subject란? (PublishSubject, Behavior Subject, Replay Subject, Variable) (1) 2018.02.14 RxSwift - Dispose란? (Disposable, DisposeBag) (0) 2018.02.06 RxSwift - Observable이란? (0) 2018.01.30 RxSwift - Observable<T> (2) 2018.01.30 RxSwift 스터디를 시작해본다. (0) 2018.01.30