iOS/ReactorKit

[ReactorKit] 기본적인 ReactorKit 흐름 만들어보기

23g 2025. 9. 11.

안냥하세요

 

오늘은 리액터킷 기본 틀을 만들ㅇㅓ 보면서 리액터킷을 어떻게 구성하는지, 어떻게 동작하는지 공부해보았어요

 

기본 흐름은

 

초기 상태가 false 인 initialState를 만들어줌

-> 리액터킷을 만들어 준다음에

-> bind() 동작하며 상태 값을 true로 바꿔줌

 

그리고 우리는 위 동작을 하는 Reactor를 만드는 것을 연습해볼 것임!

 

Reactor 만들기

import RxSwift
import ReactorKit

import Foundation

final class ViewReactor: Reactor {
 
  //사용자의 행동
  enum Action {
    case initialize
  }
 
  //상태 변화
  enum Mutation {
    case setIsInitialized(Bool)
  }
  
  //뷰 상태
  struct State {
    var isInitialized: Bool
  }
  
  //초기 상태
  let initialState: State = State(isInitialized: false)
  
  
  func mutate(action: Action) -> Observable<Mutation> {
    switch action {
    case .initialize:
      return .concat([
        .just(.setIsInitialized(true))
      ])
    }
  }
  
  
  func reduce(state: State, mutation: Mutation) -> State {
    var newState = state
    switch mutation {
    case let .setIsInitialized(value):
      newState.isInitialized = value
    }
    return newState
  }
}

 

전에 게시물에서 말씀드렸죠?

 

왜가 아니라 리액터킷은 그냥 이렇게 쓰는거임

 

이렇게 만들어진 리액터를

 

SceneDelegate에서 Reactor 주입하기

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    
    let window = UIWindow(windowScene: windowScene)
    window.windowScene = windowScene
    
    let vc = ViewController()
    vc.reactor = ViewReactor() // reactor 주입
    
    window.rootViewController = vc
    
    window.makeKeyAndVisible()
    self.window = window
  }

 

사실 아래의 뷰컨에 적용하기가 먼저인데 흐름을 설명하기엔 씬델리게이트가 먼저 나와야할 것 같아서 먼저 넣음

 

여기서 리액터가 주입되는 순간 아래 뷰컨의 bind() 메서드가 동작합니다잉

 

ViewController에서 적용하기

//
//  ViewController.swift
//  reactorKit3
//
//  Created by 23ji on 9/9/25.
//

import ReactorKit
import RxSwift

import UIKit

final class ViewController: UIViewController, View {
  
  var disposeBag = DisposeBag()

  override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = .red
  }
  
  
  func bind(reactor: ViewReactor) {
    reactor.action.onNext(.initialize)
    print("isInitialized :", reactor.initialState.isInitialized)

    
    reactor.state.map { $0.isInitialized }
      .subscribe(onNext: { value in
        print("🔥 isInitialized changed to:", value)
      })
      .disposed(by: disposeBag)
  }
}

 

 

bind가 바로 동작해서 우리가 리액터에서 정의해줬던 

상태값 false가 먼저 찍히고 onNext를 통해 바뀐 true도 출력됨!

 

 

이렇게 의도대로 잘 동작한답니다~

 

그럼 안녕~

댓글