BOID

[iOS] Appdelegate객체를 사용하여 값 전달 - HoonIOS 본문

IOS 시작기

[iOS] Appdelegate객체를 사용하여 값 전달 - HoonIOS

HoonIOS 2021. 4. 7. 15:13
728x90

안녕하세요 HoonIOS입니다. :)

 

비동기 방식인 저장소를 이용하여 값을 주고받는 방법에 대해 포스팅하겠습니다.

 

비동기 방식 중에서 Appdelegate, 코코아 터치 프레임워크에서 제공하는 UserDefaults객체 두 개에 대해서 포스팅하려고 하는데 지금은 Appdelegate 다음에는 UserDefaults로 값 전달하는 방식에 대해 설명하겠습니다.

 

-코코아 터치 프레임워크에는 값을 반영구적으로 저장할수 있도록 UserDefaults객체(NSUserDefaults)와 코어 데이터(Core Data)를 제공합니다.

* 우선 간단하게 UserDefaults와 코어데이터를 설명하면

- UserDefaults객체는 비교적 간단한 데이터를 저장하는데 사용되고 코어데이터 객체는 소규모 데이터베이스처럼 다소 복잡한 형태의 데이터를 저장할때 사용되는데 앱 개발을 할때 코어데이터를 많이 사용합니다.

( UserDefaults는 이 글 다음에 포스팅을할꺼고 코어데이터는 추후에 포스팅할 예정입니다. )

 

-저장소를 이용하면 뷰컨트롤러들이 모두 공용의 저장소를 이용하여 값을 저장한 후에 필요한 화면에서 적절한 시점에 저장소에 저장된 값을 읽어오는 방식으로 구현이 됩니다.

 

-비동기 방식을 사용하는것도 이전 화면의 스크린에 다시 등장하는 시점에서 값을 읽어와야 하므로 viewWillAppear(_:) 메서드 내부에 값을 읽어오고 표시하는 코드를 작성해야 합니다.

 

뷰컨트롤러의 값을 저장하고 읽어오는 저장소 역할을 담당하는 객체는 데이터의 성격에 따라 다양한 선택이 가능한데 가장 쉽게 사용하는 객체는 AppDelegate.swift 파일에 정의된 AppDelegate클래스입니다.

 

※AppDelegate의 특성※

  • Appdelegate는 저장소의 역할이 아니라 UIApplication 객체로부터 생명 주기 관리를 위임받아 커스텀 코드를 처리하는 역할입니다.
  • Appdelegate객체는 앱 전체에서 단 하나만 존재하므로 모든 뷰 컨트롤러에서 모두 접근을 할 수 있습니다.
  • . Appdelegate객체에 값을 저장하면 앱이 종료되지 않는 한 값을 계속 유지할 수 있습니다.
    ( 이말은 즉 앱이 종료가 되면 앱 델리게이트에 저장되었던 값도 없어진다는 말입니다. )

 

AppDelegate 객체를 사용하여 값을 전달하기

- 여기서 포스팅한 동기방식의 스토리보드를 그대로 이용해서 소스코드만 변경으로 예시를 들어 처리해보겠습니다.

- Appdelegate에 값을 저장하는 방법을 간단한 게 설명하면 Appdelegate클래스에 변수를 추가하고 값을 저장하는것입니다. 
(네 이게 끝이에요 ㅎ)

 

이제 그럼 한번 Appdelegate로 값을 전달해보겠습니다 :)

- Appdelegate 객체에 값을 저장할 프로퍼티를 선언해줍니다.

 

저장할 프로퍼티 선언

- 동기 방식에서는 Done버튼을 이용해 이전 화면의 뷰컨트롤러뷰 컨트롤러 인스턴스를 가져와 해당 뷰 컨트롤러의 값을 저장했지만 Appdelegate방식에서는 Appdelegate의 인스턴스를 가져와 값을 저장하면 됩니다.

코드 설명

 ※ AppDelegate 클래스는 앱 전체를 통틀어 하나의 인스턴스만 존재하도록 iOS 시스템에 의해 보장됩니다.
이렇게 앱전체에서 하나의 인스턴스만 존재한다는것을 싱글톤이라고 합니다.

- 싱글톤 특성 때문에 인스턴스를 직접 생성할 수 없습니다. 왜냐면 Appdelegate는 앱 실행 시 하나가 생기는데 Appdelegate 인스턴스를 생성하면 Appdelegate 인스턴스는 2개가 되기 때문입니다. 

 

- UIApplication.shared.delegate구문을 통해 현재 생성되어 있는 인스턴스를 참조할 수 있습니다.

 

* UIApplication.shared란?


- 싱글톤 앱의 인스턴스를 생성하는 하는 타입 프로퍼티로 ReturnValue를 보면은 앱 인스턴스를 생성하는 함수인 것을 알 수 있습니다.

- 만약 Appdelegate를 꼭 사용 해나...?라고 생각을 하실 수 있지만 ( 안 하셨을 수도 있습니다.. 혹시나 해서요...) 다른 클래스를 만들어서 사용을 할 수 있습니다. 대신 이 세가지 원칙을 지켜서 클래스를 만들면 대체를 할수 있습니다.

  1. UIResponse 클래스를 상속받아야 합니다.
  2. UIApplicationDelegate 프로토콜 구현을 선언해야 합니다.
  3. @UIApplicationMain 이노베이션을 붙어줘야 합니다.
    - @UIApplicationMain 어노베이션을 붙여주는 것은 이 클래스를 앱 델리게이트로 선언합니다.라는 말입니다.
    - 대신 하나의 앱에는 @UIApplicationMain 이노베이션은 한 번만 사용되어야 합니다.

- Appdelegate클래스 인스턴스를 생성을 해주고 AppDelegate 클래스 타입으로 다운 캐스팅을 해줬습니다.

그 이유는? UIApplication.shared.delegate구문으로 읽어온 앱 델리게이트 객체는 UIApplicationDelegate타입으로 되어 있기 때문에 Appldegate클래스에 선언해준 변수들을 사용하려면 캐스팅을 해주어야 합니다.
( 즉, 데이터 저장을 Appdelegate에 했으니 값을 읽어오는 클래스도 Appdelegate로 객체를 불러와야 합니다. )

 

- 값을 받는 화면을 이제 구현해보겠습니다. 

 

 코드 설명

* 값을 받아오는 게 아니라 저장소에 있는 데이터를 불러올는것이므로  저장소 역할을 한 AppDelegate로 캐스팅한 Appdelegate 인스턴스를 불러와야 합니다.

* UIApplication 값을 불러오 AD는 as?로 캐스팅을 했으므로 옵셔널로 되어 있어 옵셔널 바인딩을 해주어야 합니다.

 

구현이 모두 끝났습니다. 엄청 간단하죠 ㅎㅎ 잘 구현이 됐는지 확인해 보겠습니다.

이제 값을 직접 주고받지 않으므로 뷰 컨트롤러가 메모리에서 지워져도 값은 사라질 일이 없습니다.

 

 

값이 전달이 되는 것을 봤습니다 ㅎㅎ 근데 앱이 종료되면 데이터가 없어진다고 하니깐 좀 불편한 게 있습니다.

 

따라서 다음에는 UserDefaults 객체를 사용해서 앱이 삭제되지 않는 이상 값이 유지되는 특성을 가진 애를 살펴보겠습니다.

반응형
Comments