관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 6-2) RIBs 구조 Todo 앱 만들기 (detach child) 본문

Architecture (swift)/RIBs

[iOS - swift] 6-2) RIBs 구조 Todo 앱 만들기 (detach child)

jake-kim 2021. 4. 29. 23:17

0) 프로젝트 초기 세팅

1) Todo 앱 구조, LoggedOut RIB

2) Todo 앱 구조 LoggedIn RIB

3) Todo 앱 구조 Rx stream

이전까지 진행된 점 (child RIB 추가)

  • Add new RIB -> parent Router에 새로운 RIB의 Builder를 private let으로 선언, init 적용 
  • Attach
    • ViewFul -> Parent Router에서 나중에 detach시키기 위해 private var childName: ViewalbleRouting 선언, 저장
    • Viewless
  • LoggedOutViewController 버튼 탭 -> (p) LoggedOutPresentableListenr -> LoggedOutInteractor에서 Login처리
  • LoggedOutInteractor에서 login처리 -> (p) LoggedOutListener -> RootInteractable에서 didLogin처리

view less인 LoggedIn RIB 추가

  • view less RIB의 child에서, parent의 ViewController를 사용해야 하므로, view less RIB에 ViewController를 따로 주입
    • RootComponent+LoggedIn.swift에 있는 RootComponent에 주입
    • (오류) 주입 정의는 RootBuilder.swift의 RootComponent에서 let rootViewController: RootViewController추가, init 적용
    • (오류) RootComponent에 대한 init이 변경됐으므로, build()함수 내에도 적용, 여기서 RootViewController객체 생성하여 주입
    • (오류) RootViewController는 현재 LoggedInViewControllable 성격을 갖고 있지 않으므로 extension으로 추가
  • 코드

Child RIB에서 받을 의존성 정의

  • Component 개념: Builder.swift에 있는 (p)Dependency와 Component 사용처
    • (p)Dependency는 ParentComponent+ChildDependency와 연관이 있으며, parent의 Component에 있는 값을 전달할 때 사용
    • Component 클래스에만 의존성 정의하는 경우: Parent의 Component에는 존재하지 않지만 새로운 데이터를 받고싶은 경우 사용
  • email, password는 parent의 Component에 존재하지 않았기 때문에 LoggedInDependency가 아닌 LoggedInComponent에만 정의
    • (오류) LoggedInBuilder의 (p)LoggedInBuildable에 방금 추가한 의존성 내용 적용
    • (오류) LggedInBuiler의 build 수정
  • 코드

RouteToAnotherChild (detach 후 attach)

  • detach 준비
    • RootRouter의 (p)RootViewControllable에 dismiss추가
    • (오류) RootViewController 내부에 dismiss 구현
  • RouteToLoggedIn
    • RootInteractor의 (p)RootRouting에 routeToLoggedIn 함수 선언
    • (오류) RootRouter에 routeToLoggedIn 구현
    • (오류) LoggedInBuilder.build(interactor)시 interactor는 LoggedInBuilder의 성격을 가지고 있지 않으므로 RootRouter의 RootInteractable에 LoggedInListener 성격 추가
    • RootInteractor에 didLogin에서 routeToLoggedIn을 호출하도록 수정
  • 코드

* 정리 - view less RIB, DI, route

  • view less RIB 추가
    • 부모의 viewController 주입 (ParentComponent+ChildDependency.swift에서 주입)
  • (p)Dependency vs Component vs ParentComponent+ChildDependency
    • (p)Dependency는 ParentComponent+ChildDepenency와 연관, Parent의 Component에 있는 값 전달 용도
    • (p)Dependency 없이 Component에만 구현하는 경우: parent component에 없지만 데이터를 새로 받고싶은 경우
    • Child입장에서 의존성 요구: ChildBuilder의 (p)ChildBuildable에 build()함수 파라미터에 추가
  • routeToAnotherChild
    • ParentRouter의 (p)ParentViewControllable에 이동로직 추가, ParentViewController에서 구현
    • ParentInteractor의 (p)ParentRouting에 routeToChild 구현
    • ParentInteractor의 didLogin에서 routeToChild 호출

아래는 내용 중복: TodoList, DetailContents RIB 추가


Todo List RIB 추가

Viewless RIB이 해제될 때 child RIB dismiss 처리

  • viewless RIB 생성하는 template에서 자동으로 Interactor의 willResignActive()에서 cleanupViews()이 불리고 있는 형태
  • viewlessRouter에서 cleanupViews 부분만 구현해주면 처리 끝
  • 코드
Comments