ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1005 - iOS 앱개발 기초 - Singleton
    iOS/iOS기초(네이버edwith*obj-c) 2022. 3. 21. 12:58

     

    싱글턴 객체: 어플 내에 항상 어디서든 똑같이 존재해서 참조하는 객체

    싱글턴 패턴: ex) 슈팅게임에서 총알을 사용자가 스페이스바를 누를때마다 매번 생성하는 것이 아니라

    게임 로딩시에 미리 100개 생성해두고 필요할때마다 가져와 쓰는 것 (참조만)

    즉, 매니저가 존재하고 매니저에 객체를 요청해서 가져와 사용

     

    iOS에서는 UIApplication이 싱글턴 객체로 존재

    < 그동안의 MVC 패턴 >

    앱이 실행되고 맨 처음에 보여줄 리스트를 Model로 구현

    -> MainTableViewController가 모델에 접근해서 arrList안에 있는 내용을 보여줌

    선택된 특정 내용들을 MainTableView가 다른 view에게 계속 전달해주는 구조

     

     

    ** UX구조를 바꾼다고 가정

    detailViewController를 맨 처음으로 보여주고

    -> MapView를 보이고

    -> MainTableView

     

    MapView에다가 MainTableView가 가지고 있던 모델을 생성하는 코드를 다시 만들어주고

    화면 전환이 있을때마다 MainTableView가 detailViewController에게 객체를 전달해줘야 함 

    - 기능을 위한 부가적인 코드가 필요

    - 화면 전환과 함께 일어나는 동작들에게 매번 객체 전달 필요...

     

    ==> 싱글턴 패턴으로 해결

    controller들이 모두 Model에 접근하고 있는데 굳이 MainTableView가 Model객체를 생성하고 참조하게 해야할까?

    MainTableView에서 모델을 생성하고 참조하는 것이 아니라

    다른 viewController처럼 참조만 하게 하는 것

     

    * 그럼 모델을 언제 생성할까?

    - AppDelegate에서 공통으로 필요한 모델의 인스턴스를 생성

    (UIApplication은 싱글턴객체이므로 언제 어디서나 AppDelegate에 접근이 가능 = model에도 접근이 가능)

    - Main이든 Detal이든 Map이든 간에 모든 viewController들이 생성된 모델을 참조 가능

     

     

    1. AppDelegate에서 WordPhotosModel 객체 생성

    AppDelegate.m    /     .h

     

     

    2. MainTableViewController에서 앞서 생성된 모델 참조 / 중복되는 코드 제거

    MainTableViewController.m

     

    3. (기존) MainTableViewController에서 특정 셀이 선택되었을 때 ,

    MainTableViewController가 갖는 모델의 특정 객체를 DetailViewController에게 전달해줌 

      (변경)

    --> 선택한 index를 담아놓을 변수를 모델 자체에 지정

    --> 모델자체에게 현재 선택된 위치를 알려줌

    Model.h
    MainTableViewController.m

     

     

    4. DetailViewController에서 선택된 셀의 특정 객체를 모델에서 가져오기

    DetailViewController.m

     

    5. touchMap: 특정 셀의 map화면으로 이동 시에 굳이 model을 다시 생성할 필요X

       화면 전환 코드만 있으면 되고,  MapViewController에서 모델 참조만 하면 됨

    DetailViewController.m

     

    6. MapViewController에서 공통 모델 참조

    - 코드를 끊어서 작성할때는  동적타입 id를 써서 문제가 없지만 붙여서 결과를 받는 정적타입에서는

    강제캐스팅을 통해 명시적으로 작성돼야 함

     

     

    단점) 참조하는 곳이 많을 수록 앱 성능이 저하됨

     

    - 언제 사용되나?

    1) 서버에 접근할때 prefix를 지정해놓고 사용

    2) Userdefault

    3) class 하나 자체를 싱글턴으로 만들어 놓고 생성과정 없이 바로 접근하도록 하기도 함

     

     

    댓글

Designed by Tistory.