ReactorKit
관련 링크
https://www.youtube.com/watch?v=ASwBnMJNUK4&feature=youtu.be
Why?
- Massive View Controller
- RxSwift is Awesome
- 비동기코드를 간결하게 쓸 수 있음
Cyclic Data Dependencies
다음 작업을 위해 이전 작업의 결과가 필요
예시: 아래로 스크롤하여 다음 페이지 로드
다음 요청에 이전 요청 결과의 nextURL 필요
→ 다음 요청은 이전 요청에 의존성을 갖는다.쉽게 해결하는 방법:
BehaviorSubject
사용BehaviorSubject(=Variable)
을 남발하게 된다RxSwift는 선언적으로 작성하는 것을 권장한다.
BehaviorSubject
는 중간 상태 관리를 명령형으로 관리해야 하기 때문에 선언적으로 사용하기 힘들다
ReactorKit
단방향 데이터 흐름을 가진 반응형 앱을 위한 프레임워크
- 뷰와 로직의 관심사를 분리해 뷰 컨트롤러가 단순해짐
- RxSwift를 기반으로 해 모든 기능을 사용할 수 있음
- 상태 관리가 간결해짐
Basic Concept
View
사용자 입력을 받아서 Reactor에 전달
Reactor로부터 받은 상태를 렌더링
뷰 컨트롤러, 셀, 컨트롤 등을 모두 View로 취급
protocol View { associatedtype Reactor var disposeBag: DisposeBag // self.reactor가 바뀌면 호출됨 func bind(reactor: Reactor) }
Reactor
View에서 전달받은 Action에 따라 로직 수행
상태를 관리하고 상태가 변경되면 View에 전달
대부분의 View는 대응되는 Reactor를 가짐
protocol Reactor { associatedtype Action // 사용자 인터랙션 표현 associatedtype Mutation // 뷰의 상태 표현 associatedtype State // 상태를 변경하는 가장 작은 단위 // 가장 첫 상태를 나타냄 var intialState: State }
Action이나 State와 달리 Mutation은 리액터 클래스 밖으로 노출되지 않는다. 대신, 클래스 내부에서 Action과 State를 연결하는 역할을 수행한다. Action이 리액터에 전달되면 두 단계를 거쳐서 뷰의 상태를 변경한다.
ViewController에는 더이상 비즈니스 로직이 존재하지 않고 렌더링 코드만 존재한다. (bind
로직이 필요)
주의점
bind라는 함수를 작성을 해도 바로 동작되지 않는데, 그 이유는 bind라는 메소드는 ViewController의 reactor라는 속성에 새로운 값이 들어왔을 때만 호출되기 때문이다.
'Programming > iOS' 카테고리의 다른 글
[iOS] Apple Login(2) Verifying a User (0) | 2020.07.02 |
---|---|
[iOS] Apple Login(1) Authenticating Users with Sign in with Apple (0) | 2020.07.02 |
[RxSwift] 4시간 안에 빠르게 익혀 실무에 사용하기 시즌 2- 내용정리! (0) | 2020.04.24 |
[iOS/Swift5] Universal Links 예제 프로젝트 (2) | 2020.04.16 |
Fastlane 으로 iOS 배포를 쉽게 하자! - Fastlane with Slack (0) | 2019.10.27 |