Programming/iOS

ReactorKit으로 단방향 반응형 앱 만들기 내용 정리

devssun 2020. 4. 26. 00:00
728x90
반응형

ReactorKit

관련 링크
https://www.youtube.com/watch?v=ASwBnMJNUK4&feature=youtu.be

ReactorKit/ReactorKit

ReactorKit 시작하기

Why?

  1. Massive View Controller
  2. RxSwift is Awesome
    • 비동기코드를 간결하게 쓸 수 있음

Cyclic Data Dependencies

  • 다음 작업을 위해 이전 작업의 결과가 필요

  • 예시: 아래로 스크롤하여 다음 페이지 로드

  • 다음 요청에 이전 요청 결과의 nextURL 필요
    → 다음 요청은 이전 요청에 의존성을 갖는다.

  • 쉽게 해결하는 방법: BehaviorSubject 사용

  • BehaviorSubject(=Variable) 을 남발하게 된다

  • RxSwift는 선언적으로 작성하는 것을 권장한다. BehaviorSubject 는 중간 상태 관리를 명령형으로 관리해야 하기 때문에 선언적으로 사용하기 힘들다

ReactorKit

단방향 데이터 흐름을 가진 반응형 앱을 위한 프레임워크

  • 뷰와 로직의 관심사를 분리해 뷰 컨트롤러가 단순해짐
  • RxSwift를 기반으로 해 모든 기능을 사용할 수 있음
  • 상태 관리가 간결해짐

Basic Concept

  1. View

    • 사용자 입력을 받아서 Reactor에 전달

    • Reactor로부터 받은 상태를 렌더링

    • 뷰 컨트롤러, 셀, 컨트롤 등을 모두 View로 취급

      protocol View {
        associatedtype Reactor
      
        var disposeBag: DisposeBag
      
        // self.reactor가 바뀌면 호출됨
        func bind(reactor: Reactor)
      }
  2. 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라는 속성에 새로운 값이 들어왔을 때만 호출되기 때문이다.

반응형