[UIKit] InstagramClone: Set Dependencies

Junyoung Park·2022년 11월 6일
0

UIKit

목록 보기
79/142
post-thumbnail
post-custom-banner

Build Instagram App: Part 2 (Swift 5) - 2022 - Xcode 11 - iOS Development

InstagramClone: Set Dependencies

구현 목표

  • 프로젝트 사용 디펜던시 설정
  • 로그인 여부에 따라 뷰 핸들링

구현 태스크

  • 파이어베이스 세팅
  • MVVM 형식의 서비스 매니저, 뷰 모델, 뷰(컨트롤러) 분리
  • 로그인 상황에 따른 홈 뷰 - 로그인 뷰 이동

핵심 코드

private func bind() {
        let output = viewModel.transform(input: input.eraseToAnyPublisher())
        output
            .receive(on: DispatchQueue.main)
            .sink { [weak self] result in
                switch result {
                case .loginOutput(result: let result):
                    if !result {
                        self?.handleNotLogined()
                    }
                }
            }
            .store(in: &cancellables)
    }
  • 탬 바의 첫 번째 뷰 컨트롤러인 홈 뷰 컨트롤러의 바인딩 구문
  • 뷰 모델과의 바인딩을 통해 컨트롤러 단의 인풋을 뷰 모델에게 넘겨주기
func transform(input: AnyPublisher<Input, Never>) -> AnyPublisher<Output, Never> {
        input
            .receive(on: DispatchQueue.global(qos: .default))
            .sink { [weak self] result in
                switch result {
                case .isAlreadyLogin: self?.isAlreadyLogin()
                }
            }
            .store(in: &cancellables)
        return output.eraseToAnyPublisher()
    }
  • 뷰 컨트롤러부터 입력되는 인풋의 종류에 따라 내보낼 종류가 달라짐
  • 뷰 컨트롤러가 뷰 모델에게 현재 로그인한 상태인지 질문, 뷰 모델은 자신이 소유한 인증 매니저를 통해 로그인 여부를 확인
class AuthManager {
    private let auth = FirebaseAuth.Auth.auth()
    
    func isSignedIn() -> Bool {
        return auth.currentUser != nil
    }
    
}
  • 로그인 여부를 확인하는 간단한 매니저 클래스
private func handleNotLogined() {
        let loginVC = LoginViewController()
        loginVC.modalPresentationStyle = .fullScreen
        present(loginVC, animated: true)
    }
  • 뷰 모델로부터 받은 아웃풋이 로그인되지 않은 상황이라면 풀 모달 형태로 로그인 뷰 컨트롤러를 현재 홈 뷰에서 띄우기

구현 화면

강의에서는 프로그레스 뷰(로딩 뷰)를 서드 파티를 통해 구현하고 있는데, UIActivityIndicatorView를 사용하도록 하겠다.

profile
JUST DO IT
post-custom-banner

0개의 댓글