-
[RxSwift] 01.Fundamental / rawiOS/RxSwift 2021. 12. 19. 01:13
이 게시글은 raywenderlich, RxSwift: Reactive Programming with Swift 책을 참고하여 작성한 글입니다.
*RxSwift, in its essence, simplifies developing asynchronous programs by allowing your code to react to new data and process it in a sequential, isolated manner*.
RxSwift는
asynchronous programming
을 단순화해준다.다른 여러가지 방법들
- NotificationCenter
- delegate pattern
- Grand Centeral Dispatch
- Closure
Foundation of RxSwift
- Observable
asynchronous
하게 sequence of event를produce
한다.- 이로써 consumer가 event등을
subscribe
할 수 있다. observer
가 event에 반응하고 UI를 업데이트 할 수 있게 해준다.ObservableType
- next이를 통해
observer
가 value를 "recieve"할 수 있다. - terminating event가 나오기 전까지 계속해서 전달한다.
- 가장 최신의 데이터를 전달하는 event.
- completed
- 성공적으로 event sequence를 종료한다는 뜻의 event이다.
- error
- 에러가 발생해서 event sequence를 종료한다는 뜻의 event이다.
- next이를 통해
- 단 세개만이 존재한다.
- finite / infinite
- finite
- 어떤 Observable sequence는 0, 1 또는 다른 값을 방출한 뒤, 성공적으로 또는 에러를 통해 종료된다.
API.download(file: "http://www...") .subscribe( onNext: { data in // Append data to temporary file }, onError: { error in // Display error to user }, onCompleted: { // Use downloaded file } )
- 어떤 Observable sequence는 0, 1 또는 다른 값을 방출한 뒤, 성공적으로 또는 에러를 통해 종료된다.
- infinite
- 자연스럽게 혹은 강제적으로 종료되는 파일 다운로드와 같은 작업과는 달리, 무한정으로 지속되는 작업들이 있다.
- UI event들이 그런 infinite observable sequence의 종류이다.
UIDevice.rx.orientation .subscribe(onNext: { current in switch current { case .landscape: // Re-arrange UI for landscape case .portrait: // Re-arrange UI for portrait } })
- finite
- Operator
Observable
의 비동기적인 작업들을 추상화한 메소드들이다.- 매우 독립적이고 쉽게 결합이 가능하다.
- 부수작용이 없다.
- 예를들어서
(5 + 6) * 10 - 2
라는 수식을 생각해보면,+
,*
,-
,()
의 연산자들이 미리정해진 순서에 따라서, 최종적인 결과가 나올때 까지 작업이 수행된다.
- 위와 비슷한 방식으로,
Operator
또한 정해진 순서로 작업을 처리해서, 최종적인 결과가 나올 때 까지 작업이 수행된다. 그 최종적인 결과를side effect
를 발생시키기 위해서 사용할 수 있다. - 위의 예시에 operator를 적용하면 아래와 같다.
-
UIDevice.rx.orientation .filter { $0 != .landscape } .map { _ in "Portrait is the best!" } .subscribe(onNext: { string in showAlert(text: string) })
- Scheduler
- dispatch queue, or operation queue와 비슷한데 사용은 더 쉽다.
- RxSwift는 미리 만들어진 scheduler을 갖고있는데, 이것들은 99%의 케이스들을 모두 커버할 수 있어서 새로 만들 필요가 없다.예를 들어서 왼쪽은 여러가지 작업들이고, 오른쪽은 Scheduler의 동작을 보여주는데,서로 다른 3개의 Scheduler에서 3개의 쪼개진 작업들이 수행된다.
- network subscription의 경우, RxSwift를 거쳐서
App architecture
RxSwift는 architecture에 영향을 주지 않는다.
이것은 대부분 events, asynchronous data sequences 등을 다루기 때문이다.
따라서 기존의 코드를 모두 Rx로 바꿀 필요 없이, 하나씩 차근차근 바꿔나가던지, 새로 추가되는 것들에 대해서만 적용할 수도 있다.
MVC, MVP, MVVM 어느 architecture에서든 Rx로 구현할 수 있다.
단지 MVVM의 ViewModel에서 Rx를 적용하면, model data와 UI를 매우 간단하게 결합할 수 있기 때문에 잘 맞는 것이다.
RxCocoa
RxSwift는 흔하고, 플랫폼에 상관없이 동작하고, Rx의 구체화되어서 구현된 것이다.
그래서 이 RxSwift는 Cocoa나 UIKit에 대해서 하나도 모른다.
RxCocoa는 Cocoa나 UIKit을 사용하는 개발을 돕기위해 그들의 모든 class들을 갖고있는 RxSwift의 짝이다.
예를들어 UISwitch의 상태 변화를 subscribe하는 코드를 보면 아래와 같다.
toggleSwitch.rx.isOn .subscribe(onNext: { isOn in print(isOn ? "It's ON" : "It's OFF") })
이거 말고도 다른 모든 class들을 활용할 수 있고, custom extension에 대해서도 활용할 수 있다.
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Error Handling [2] (0) 2022.01.27 [RxSwift] Error Handling [1] (0) 2022.01.25 RxSwift로 리펙토링 맛보기 (0) 2022.01.03 [Rxswift] 03.Subjects (0) 2021.12.19 [RxSwift] 02.Observables / raw (0) 2021.12.19