라이징캠프 iOS 11기 2주차 개발일지(1)

Ryu_jin·2022년 11월 7일
0
post-thumbnail

2주차 개발일지

[복습을 위한 질문]

  • Q. 생명주기(Lifecycle) 이란 무엇인가?

    • 생명주기란 앱의 최초 실행부터 앱이 완전히 종료되기까지 앱이 가지는 상태와 그 상태들 사이의 전이를 뜻한다.

    • Life Cycle 은 두 종류로 구분된다

      • 앱의 생명주기
      • ViewController의 생명주기
    • 이해를 돕는 구조
      - AppDelegate + SceneDelgate

      • AppDelegate의 역할

        이전에는 앱이 foreground에 들어가거나 background로 이동할 때 앱의 상태를 업데이트하는 등의 앱의 주요 생명 주기 이벤트를 관리했었지만 더이상 하지 않습니다.
        현재 하는 일은

        • 앱의 중요한 데이터 구조를 초기화한다.
        • Scene을 환경설정한다.
        • 앱 밖에서 발생하는 알림에 대응한다. (배터리 부족, 전화 수신)
        • 특정 Scene, View, ViewController에 한정되지 않고, 앱 자체를 타깃으로 하는 이벤트에 대응한다.
        • 애플 푸시 알림 서비스처럼 실행 시 요구되는 모든 서비스를 등록한다.
          • SceneDelegate의 역할
        SceneDelegate.swift 생명주기 메서드
        • scene(_: willConnectTo: options:) scene이 앱에 추가될 때 호출, 단 여기서 ViewController와 같은 클래스 객체를 만들어 사용할 때, 아직 viewDidLoad()가 호출되지 않음
          • sceneDidDisconnect(_:) scene의 연결이 해제될 때 호출
          • sceneDidBecomeActive(_:) app switcher에서 선택되는 등 scene과의 상호작용이 시작될때 호출 app switcher 홈 버튼을 두 번누르거나 아이폰 하단에서 위로 스와이프 했을 때 현재 실행중인 앱들이 보이는 화면
          • sceneWillResignActive(_:) 사용자가 scene과의 상호작용을 중지할 때 호출(다른 화면으로의 전환과 같은 경우)
          • sceneWillEnterForeground(_:) scene이 foreground로 진입할 때 호출
          • sceneDidBackground(_:) scene이 background로 진입할 때 호출
        • AppLifeCycle + ViewLifeCycle

           
    • ViewController 생명주기 메서드

      • loadView()
      • **viewDidLoad()**
      • **viewWillAppear()**
      • **viewDidAppear()**
      • **viewWillDisappear()**
      • **viewDidDisappear**
  • Q. iOS Programming에서 생명주기가 있는 객체는 무엇들이 있는가? (수업 내용 한정)

    • AppDelegate
    • SceneDelegate
  • Q. 옵셔널이 나타난 배경과 사용하는 방법은 어떻게 되는가?

    • 옵셔널이란 - 하나의 타입 ( value나 nil이 있는 ), 값의 부재
      • 값이 있을 수도 있고 없을 수도 있는 것
    • 사용하는 이유
      • 옵셔널이 없어서 매번 앱을 실행해서 찾지 않기 위해
      • 로직 하나하나 확인 해보는 번거로움을 없애준다.
    • 사용 방법
      • 값이 있을 수도 있고 없을 수도 있는 변수를 정의할 때에는 타입 어노테이션에 ?
        를 붙여야 한다.
      • 옵셔널에 초깃값을 지정하지 않으면 기본값은 nil
        입니다.
    • 옵셔널 벗기기
      • ? 대신 !를 사용하여 암묵적으로 벗겨진 옵셔널을 사용한다.
      • 유의 nil값이 아니라고 확신할때!
    • 옵셔널 바인딩
    • 옵셔널 체이닝
  • Q. MVC 패턴은 무엇인가?

    MVC 패턴은 애플에서 기본적으로 지원하는 디자인 패턴으로

    Model + View + Controller 구조의 아키텍처 패턴을 말한다.

    `Model + View + Controller` 사이에 유기적으로 연결이 되어서 구성을 하고 있는 아키텍처 패턴

    Model은 앱의 데이터 혹은 비즈니스 로직

    View는 사용자에게 데이터를 보여주거나 UI를 담당한다. (앱 화면의 하나 하나 )

    • 주로 struct 라는 구조체로 멤버변수가 있고 사용자가 정의하는 자료형 느낌~

    • ex) 테이블 뷰 관련

      Controller는 Model과 View의 중간다리 역할로 View로부터 사용자의 action을 받아 Model에게 어떤 작업을 해야 하는지 알려주거나, Model의 데이터 변화를 View에게 전달하여 View를 어떻게 업데이트할지 알려준다.

    • 사용자가 뷰에서 액션을 가할시 데이터 변화가 생길 경우 그걸 감지해서 뷰에게 데이터 변화를 띄워줘라 이런느낌

      🔥 MVC 패턴의 장점 및 단점

      👍 장점

    • 다른 패턴에 비해 코드량이 적다.

    • 또한, 애플에서 기본적으로 지원하고 있는 패턴이기 때문에 쉽게 접근할 수 있다.

    • 많은 개발자들에게 친숙한 패턴이기 때문에 개발자들이 쉽게 유지보수 할 수 있다.

    • 개발 속도가 빠르기 때문에 아키텍처가 중요하지 않을 때 사용하거나 규모가 작은 프로젝트에서 사용하기 좋다.

      👎 단점

      https://velog.velcdn.com/images%2Fzooneon%2Fpost%2F36581ee1-31f6-41a9-bc35-81124ba3beba%2Fimage.png

    • 우선 위의 사진과 같이 View와 Controller가 너무 밀접하게 연결되어 있다.

    • ViewController에서 볼 수 있듯이, View와 Controller가 붙어 있으며, Controller가 View의 Life Cycle까지 관리하기 때문에 View와 Controller를 분리하기 어렵다.

    • 이렇게 되면 재사용성이 떨어지고, 유닛 테스트를 진행하기 힘들어진다.또한 대부분의 코드가 Controller에 밀집될 수 있다.

    • Life Cycle 관리 뿐만아니라, delegate나 datasource 관리, 네트워크 요청, DB에 데이터 요청 등 많은 코드가 Controller에 작성되면 Controller의 크기는 비대해지고 내부 구조는 복잡해지게 된다.

    • 이런 상황을 비유해 많은 사람들이 Massive View Controller라고 부르기도 한다.이렇게 복잡해진 코드는 프로젝트 규모가 커질수록 유지보수하기 힘들게 만든다.


  • IBAction, IBOutlet의 역할

    • 이 둘의 역할은 StoryBoard와의 연결고리를 담당한다.
    • 변수나 함수를 정의할 때 앞에 @IBAction 또는 @IBOutlet 키워드를 통해 StoryBoard에서 버튼이나 레이블같은 컴포넌트와 연결이 가능하다.
    • IBAction은 Event가 일어난 경우 호출되는 Action을 정의해둔 것이고, IBOutlet은 값에 접근하기위한 변수라고 보면 편할 것 같다.
    • IB는 Interface Builder의 약자이다
  • **서브스크립트 (Subscripts)**

    • 클래스, 구조체 그리고 열거형에서 스크립트를 정의해 사용할 수 있습니다

    • 서브스크립트 : 콜렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법

      • 컬렉션 에서 자료형을 가져오는 접근 방식 문법을 서브 스크립트라고함

      ex ) dictionary


1. 생명주기를 활용한 앱 클론 프로그래밍

  • 서브웨이 만들기

👏🏻사용한 UIKit 컴포넌트

  • UITabBarController - 화면 아래 로그인
    • 로그인 모양 (Tab Bar Item으로 구현)
  • **UINavigationController -** 화면 위 네비게이션
    • 메뉴와 장바구니 (Bar Button Item으로 구현)
    • 서브웨이 로고의 경우 커스텀 하여 소스로 작성
  • **UITabBarItem**
  • **UIBarButtonItem**
  • UIButton
  • **UILabel**
  • **UIImageView**

그외 기능들

  • 백그라운드 블러 처리의 경우 SceneDelegate 에서 블러처리 하는 함수를 만들고
    ResignActive-switcher 모드 와 EnterBackground 에서 호출하여 블러 처리함
  • 런치 스크린의 경우 너무 짧게 사라져서 AppDelegate에서 sleep()호출하여 시간을 지연 시켰음
  • 화면 전환의 경우 버튼이 눌릴시 이벤트로 present를 이용하여 전환
    전환 중 화면이 꽉 차지 않았던 점은 present 속성 중 UIModalPresentationStyle.fullScreen 을 사용하여 해결
  • PageViewController의 경우 사용할 화면들을 배열로 만들어 ContainerView에 담아서 사용했으나
    아직 내 소스로 받아들이기에 조금 더 공부해야함
  • 시험으로 구현하지 못한 것.. 주문 로직…
  • 커스텀 네비게이션 타이틀을 사용한 후 ? 밑의 오류 발생하여 검은화면만 출력 됌 구글링하여도 정보가 없어 해결해야함
  • 기종을 바꾸어 구형 기종으로 실행시 위 오류가 로그에 뜨긴하나 정상 작동함

[Assert] UINavigationBar decoded as unlocked for UINavigationController, or navigationBar delegate set up incorrectly. Inconsistent configuration may cause problems.

주문 로직과 오류 수정하여 완성해야함….

  • 피드백
    • Windows가 하나의 창을 더 만들어서 덮어준다는 느낌 - 블러처리시
    • 가격 같은 부분 꼭 쉼표 넣어주기
    • pageviewcontroller pagecontrol
    • 특정뷰에서 클릭이 필요할경우 버튼 만들기 보다 제스쳐 이용하기

  • 3주차 미리 학습

    • 스택 뷰는 담아서 정렬 시키기 좋은 거?

    • 테이블 뷰는 언제 사용할까 → 가로로 스와이프 삭제가능

    • 컬랙션 뷰는 → 갤러리 형식이지만 가로로도 만들수있음

    • 테이블 뷰와 컬렉션 뷰 → 데이터를 다루기 쉬움 CRUD → 안드로이드 리사이클러뷰 와 유사한듯 하다.

    • 컬렉션뷰 디폴트 이미지는 갤러리 와 유사하다.

    • 테이블 뷰 는 리사이클러느낌? + dequeue.reusable 위에꺼 다시아래로오는 리사이클러뷰와 같음 - 재사용 시 데이터 초기화 이슈 확인하기

      • 이로인해 값을 바꿧지만 초기화 되는 이슈 발생 해결방법 = ? 초기화 -> prepare
    • Delegate → (위임, 대리)

    • Delegate 패턴
      Delegate - Protocol

      mvvm - view 는 로직이 있으면 안되서 viewmodel에 로직 작성 
      후에 viewmodel 함수를 가져다 씀 
profile
Empire

0개의 댓글