참고 링크 : github.com/uber/RIBs/wiki/iOS-Tutorial-1
목표
- RIB의 다양한 조각(piece) 이해하기
- 서로 어떻게 상호작용하고 통신하는지 이해하기
산출물
두개의 플레이어의 이름을 입력하고 로그인 버튼을 누르면 Xcode 콘솔에 해당 플레이어들의 이름이 출력됨
player1 vs player2
프로젝트 구조
(파파고 번역...)
우리가 제공하는 보일러 플레이트 코드는 두 개의 RIB로 구성된 iOS 프로젝트를 포함하고 있다. 앱이 시작되면 AppDelegate는 루트 RIB를 구축하고 애플리케이션에 대한 제어를 전송한다. 루트 RIB의 목적은 RIBs 트리의 루트 역할을 하고 필요할 때 해당 하위 트리에 제어를 전달하는 것이다. 루트 RIB의 코드는 대부분 Xcode 템플릿에 의해 자동으로 생성되며, 이 코드는 이 연습에 필요하지 않다.
TicTacToe 앱의 두 번째 RIB를 LoggedOut이라고 하며, 로그인 인터페이스를 포함하고 인증 관련 이벤트를 관리해야 한다. 루트 RIB가 AppDelegate에서 앱을 제어하면 즉시 로그인 양식을 표시하기 위해 LoggedOut RIB로 전송한다. LoggedOut RIB의 구축 및 프레젠테이션을 담당하는 코드가 이미 제공되었으며 RootRouter에서 찾을 수 있다.
현재, LoggedOut RIB가 구현되지 않았다. LoggedOut를 여는 경우 그룹 외부에서는 코드를 컴파일하는 데 필요한 일부 스텁이 있는 DELETE_ME.swift 파일만 찾을 수 있다. 이 튜토리얼에서는 LoggedOut RIB의 적절한 구현을 생성한다.
- 라우터는 RIB끼리의 길찾는 일을 해줌
- 인터랙터는 어플의 뇌처럼 비즈니스 로직을 담당
- 뷰(컨트롤러)는 레이아웃과 애니메이션을 담당
아래는 방금 생성한LoggedOut RIB를 구성하는 모든 클래스이다.
- The LoggedOutBuilder conforms to LoggedOutBuildable so other RIBs that use the builder can use a mocked instance that conforms to the buildable protocol.
(LoggedOutBuilder는 LoggedOutBuildable를 따른다. 그래서 빌더를 사용하는 다른 ribs가 빌드 가능한 프로토콜을 준수하는 인스턴스를 사용할 수 있다.) - The LoggedOutInteractor uses the LoggedOutRouting protocol to communicate with its router. This is based on the dependency inversion principle where the interactor declares what it needs, and some other unit, in this case, the LoggedOutRouter, provides the implementation. Similar to the buildable protocol, this allows the interactor to be unit-tested. LoggedOutPresentable is the same concept that allows the interactor to communicate with the view controller.
(LoggedOut Interactor는 LoggedOut Routing 프로토콜을 사용하여 라우터와 통신합니다. 이는 인터랙터가 필요한 것을 선언하고, 이 경우 다른 장치인 LoggedOut Router가 구현을 제공하는 종속성 반전 원칙에 기초한다. 빌드 가능한 프로토콜과 유사하게, 이를 통해 인터랙터를 유닛 테스트 할 수 있습니다. LoggedOutPresentable은 인터랙터가 뷰 컨트롤러와 통신할 수 있는 것과 동일한 개념입니다.) - The LoggedOutRouter declares what it needs from the LoggedOutInteractable to communicate with its interactor. It uses the LoggedOutViewControllable to communicate with the view controller.
(LoggedOutRouter는 인터랙터와 통신하기 위해 LoggedOutInteractable에서 필요한 사항을 선언합니다. 뷰 컨트롤러와 통신하기 위해 LoggedOutViewControlable를 사용한다.) - The LoggedOutViewController uses LoggedOutPresentableListener to communicate with its interactor following the same dependency inversion principle.
(LoggedOutViewController는 LoggedOutPresentableListener를 사용하여 동일한 종속성 반전 원칙에 따라 인터랙터와 통신합니다.)
OutViewControlable
RIB는 꼭 view controller를 필요로 하지 않지만 여기서는 로그인이라는 인터페이스를 포함하므로 LoggedOut이라는 view controller를 만들어준다.
LoggedOutViewController에서 뷰 컨테이너가 만들어짐
여기서 버튼, 텍스트박스 같은 인터페이스를 구성하고 관련 리스너, 함수도 작성
플로우
buildLoginButton -> didTapLoginButton -> LoggedOutPresentableListener -> (LoggedOutInteractor) login => print
- 레이아웃 빌드할 때 로그인 버튼이 didTapLoginButton을 액션으로 걸고 계속 대기 중 (buildLoginButton)
- 유저가 로그인 버튼을 누르면 didTapLoginButton이 LoggedOutPresentableListener를 부름.
- 리스너는 게임에 참여하려는 플레이어의 이름을 받음. login() 호출
- 전달받은 이름이 없으면 디폴트 이름으로 설정, 콘솔에 'Player1 vs Player2'가 찍힘