BOID
[iOS] Appdelegate객체를 사용하여 값 전달 - HoonIOS 본문
안녕하세요 HoonIOS입니다. :)
비동기 방식인 저장소를 이용하여 값을 주고받는 방법에 대해 포스팅하겠습니다.
비동기 방식 중에서 Appdelegate, 코코아 터치 프레임워크에서 제공하는 UserDefaults객체 두 개에 대해서 포스팅하려고 하는데 지금은 Appdelegate 다음에는 UserDefaults로 값 전달하는 방식에 대해 설명하겠습니다.
-코코아 터치 프레임워크에는 값을 반영구적으로 저장할수 있도록 UserDefaults객체(NSUserDefaults)와 코어 데이터(Core Data)를 제공합니다.
- UserDefaults객체는 비교적 간단한 데이터를 저장하는데 사용되고 코어데이터 객체는 소규모 데이터베이스처럼 다소 복잡한 형태의 데이터를 저장할때 사용되는데 앱 개발을 할때 코어데이터를 많이 사용합니다.
( UserDefaults는 이 글 다음에 포스팅을할꺼고 코어데이터는 추후에 포스팅할 예정입니다. )
-저장소를 이용하면 뷰컨트롤러들이 모두 공용의 저장소를 이용하여 값을 저장한 후에 필요한 화면에서 적절한 시점에 저장소에 저장된 값을 읽어오는 방식으로 구현이 됩니다.
-비동기 방식을 사용하는것도 이전 화면의 스크린에 다시 등장하는 시점에서 값을 읽어와야 하므로 viewWillAppear(_:) 메서드 내부에 값을 읽어오고 표시하는 코드를 작성해야 합니다.
※ 뷰컨트롤러의 값을 저장하고 읽어오는 저장소 역할을 담당하는 객체는 데이터의 성격에 따라 다양한 선택이 가능한데 가장 쉽게 사용하는 객체는 AppDelegate.swift 파일에 정의된 AppDelegate클래스입니다.
※AppDelegate의 특성※
- Appdelegate는 저장소의 역할이 아니라 UIApplication 객체로부터 생명 주기 관리를 위임받아 커스텀 코드를 처리하는 역할입니다.
- Appdelegate객체는 앱 전체에서 단 하나만 존재하므로 모든 뷰 컨트롤러에서 모두 접근을 할 수 있습니다.
- . Appdelegate객체에 값을 저장하면 앱이 종료되지 않는 한 값을 계속 유지할 수 있습니다.
( 이말은 즉 앱이 종료가 되면 앱 델리게이트에 저장되었던 값도 없어진다는 말입니다. )
AppDelegate 객체를 사용하여 값을 전달하기
- 여기서 포스팅한 동기방식의 스토리보드를 그대로 이용해서 소스코드만 변경으로 예시를 들어 처리해보겠습니다.
- Appdelegate에 값을 저장하는 방법을 간단한 게 설명하면 Appdelegate클래스에 변수를 추가하고 값을 저장하는것입니다.
(네 이게 끝이에요 ㅎ)
이제 그럼 한번 Appdelegate로 값을 전달해보겠습니다 :)
- Appdelegate 객체에 값을 저장할 프로퍼티를 선언해줍니다.
- 동기 방식에서는 Done버튼을 이용해 이전 화면의 뷰컨트롤러뷰 컨트롤러 인스턴스를 가져와 해당 뷰 컨트롤러의 값을 저장했지만 Appdelegate방식에서는 Appdelegate의 인스턴스를 가져와 값을 저장하면 됩니다.
코드 설명
이렇게 앱전체에서 하나의 인스턴스만 존재한다는것을 싱글톤이라고 합니다.
- 싱글톤 특성 때문에 인스턴스를 직접 생성할 수 없습니다. 왜냐면 Appdelegate는 앱 실행 시 하나가 생기는데 Appdelegate 인스턴스를 생성하면 Appdelegate 인스턴스는 2개가 되기 때문입니다.
- UIApplication.shared.delegate구문을 통해 현재 생성되어 있는 인스턴스를 참조할 수 있습니다.

- 싱글톤 앱의 인스턴스를 생성하는 하는 타입 프로퍼티로 ReturnValue를 보면은 앱 인스턴스를 생성하는 함수인 것을 알 수 있습니다.
- 만약 Appdelegate를 꼭 사용 해나...?라고 생각을 하실 수 있지만 ( 안 하셨을 수도 있습니다.. 혹시나 해서요...) 다른 클래스를 만들어서 사용을 할 수 있습니다. 대신 이 세가지 원칙을 지켜서 클래스를 만들면 대체를 할수 있습니다.
- UIResponse 클래스를 상속받아야 합니다.
- UIApplicationDelegate 프로토콜 구현을 선언해야 합니다.
- @UIApplicationMain 이노베이션을 붙어줘야 합니다.
- @UIApplicationMain 어노베이션을 붙여주는 것은 이 클래스를 앱 델리게이트로 선언합니다.라는 말입니다.
- 대신 하나의 앱에는 @UIApplicationMain 이노베이션은 한 번만 사용되어야 합니다.
- Appdelegate클래스 인스턴스를 생성을 해주고 AppDelegate 클래스 타입으로 다운 캐스팅을 해줬습니다.
그 이유는? UIApplication.shared.delegate구문으로 읽어온 앱 델리게이트 객체는 UIApplicationDelegate타입으로 되어 있기 때문에 Appldegate클래스에 선언해준 변수들을 사용하려면 캐스팅을 해주어야 합니다.
( 즉, 데이터 저장을 Appdelegate에 했으니 값을 읽어오는 클래스도 Appdelegate로 객체를 불러와야 합니다. )
- 값을 받는 화면을 이제 구현해보겠습니다.
코드 설명
* 값을 받아오는 게 아니라 저장소에 있는 데이터를 불러올는것이므로 저장소 역할을 한 AppDelegate로 캐스팅한 Appdelegate 인스턴스를 불러와야 합니다.
* UIApplication 값을 불러오 AD는 as?로 캐스팅을 했으므로 옵셔널로 되어 있어 옵셔널 바인딩을 해주어야 합니다.
구현이 모두 끝났습니다. 엄청 간단하죠 ㅎㅎ 잘 구현이 됐는지 확인해 보겠습니다.
이제 값을 직접 주고받지 않으므로 뷰 컨트롤러가 메모리에서 지워져도 값은 사라질 일이 없습니다.
값이 전달이 되는 것을 봤습니다 ㅎㅎ 근데 앱이 종료되면 데이터가 없어진다고 하니깐 좀 불편한 게 있습니다.
따라서 다음에는 UserDefaults 객체를 사용해서 앱이 삭제되지 않는 이상 값이 유지되는 특성을 가진 애를 살펴보겠습니다.
'IOS 시작기' 카테고리의 다른 글
[iOS] 사용자에게 메시지를 전달하는 방법에 대해 - HoonIOS (0) | 2021.04.08 |
---|---|
[iOS] UserDefaults객체를 사용하여 값 전달 - HoonIOS (0) | 2021.04.07 |
[iOS] 이전 화면으로 값을 전달하기 (1) | 2021.04.05 |
[iOS] 데이터 직접 전달하는 방식(내비게이션, 세그웨이 이용) - HoonIOS (0) | 2021.04.04 |
[iOS] 데이터 직접 전달하는 방식 (동기방식) -HoonIOS (0) | 2021.04.03 |