-
1005 - iOS 앱개발 기초 - SingletoniOS/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 객체 생성
2. MainTableViewController에서 앞서 생성된 모델 참조 / 중복되는 코드 제거
3. (기존) MainTableViewController에서 특정 셀이 선택되었을 때 ,
MainTableViewController가 갖는 모델의 특정 객체를 DetailViewController에게 전달해줌
(변경)
--> 선택한 index를 담아놓을 변수를 모델 자체에 지정
--> 모델자체에게 현재 선택된 위치를 알려줌
4. DetailViewController에서 선택된 셀의 특정 객체를 모델에서 가져오기
5. touchMap: 특정 셀의 map화면으로 이동 시에 굳이 model을 다시 생성할 필요X
화면 전환 코드만 있으면 되고, MapViewController에서 모델 참조만 하면 됨
6. MapViewController에서 공통 모델 참조
- 코드를 끊어서 작성할때는 동적타입 id를 써서 문제가 없지만 붙여서 결과를 받는 정적타입에서는
강제캐스팅을 통해 명시적으로 작성돼야 함
단점) 참조하는 곳이 많을 수록 앱 성능이 저하됨
- 언제 사용되나?
1) 서버에 접근할때 prefix를 지정해놓고 사용
2) Userdefault
3) class 하나 자체를 싱글턴으로 만들어 놓고 생성과정 없이 바로 접근하도록 하기도 함
'iOS > iOS기초(네이버edwith*obj-c)' 카테고리의 다른 글
1005 - iOS 앱개발 기초 - ModalView (0) 2022.03.21 1005 - iOS 앱개발 기초 - UINavigationBar & BarbuttonItem (0) 2022.03.20 1005 - iOS 앱개발 기초 - 화면전환 (0) 2022.03.10 1005 - iOS 앱개발 기초 - UITableViewController more (0) 2022.03.09 1005-iOS앱개발 기초>화면 전환구조와 NavigationController (0) 2022.03.05