반응형
해당 글에서는 Swift에서 데이터를 저장하고 읽을 수 있는 공간을 위해 NotificationCenter, UserDefalts, AppGroup(FileManager)에 대해서 이해를 돕기 위한 목적으로 작성하였습니다
1) NotificationCenter
💡 NotificationCenter 이란?
- 앱 내에서 발생한 이벤트를 다른 객체에게 알리기 위해 사용됩니다. 이벤트를 post 하면 해당 이벤트를 구독하고 있는 객체들이 이벤트를 받아 처리할 수 있습니다.
- NotificationCenter는 앱이 실행되는 동안 메모리에 상주하므로 앱이 종료되면 저장되지 않습니다.
1. 주요 메서드
메서드 | 기능 |
NotificationCenter.default.addObserver(_:selector:name:object:) | NotificationCenter에서 특정 이벤트에 대해 observer를 등록하는 메서드입니다. |
NotificationCenter.default.post(name:object:userInfo:) | 등록된 observer들에게 이벤트를 전달하는 메서드입니다. |
2. 주요 메서드의 매개변수
2.1. addObserver(_:selector:name:object:)
- observer: 이벤트를 수신할 observer
- selector: 이벤트가 발생하면 호출될 selector
- name: 등록하려는 이벤트의 이름
- object: 이벤트와 연관된 객체
2.2. post(name:object:userInfo:)
- name: 전달하려는 이벤트의 이름
- object: 이벤트와 연관된 객체
- userInfo: 이벤트와 함께 전달할 데이터
3. 코드 예시
// 데이터를 전송하는 측에서
let data = ["key": "value"]
NotificationCenter.default.post(name: Notification.Name("notificationName"), object: nil, userInfo: data)
// 데이터를 수신하는 측에서
NotificationCenter.default.addObserver(self, selector: #selector(handleNotification(_:)), name: Notification.Name("notificationName"), object: nil)
@objc func handleNotification(_ notification: Notification) {
if let data = notification.userInfo as? [String: Any], let value = data["key"] as? String {
// 데이터 처리
}
}
2) UserDefaults
💡 UserDefaults란?
- 간단한 데이터를 저장하기 위해 사용되며 주로 앱의 설정 정보를 저장하는데 사용됩니다.
- 앱이 실행되는 동안 메모리에 상주하며, 앱이 종료되어도 데이터는 유지됩니다.
- 앱에서 사용자 정보를 저장하고 불러오는데 사용되는 객체이며 앱의 설정 값이나 사용자 정보와 같은 작은 데이터를 저장하기에 적합합니다.
- 구조는 키-값 쌍으로 데이터를 저장하고 이를 식별하는 키를 사용하여 데이터를 저장 및 조회합니다. 이러한 데이터는 앱이 종료되거나 다시 시작되더라도 유지됩니다.
1. 주요 메서드
메서드 | 기능 |
UserDefaults.standard.set(_:forKey:) | UserDefaults에 값을 저장하는 메서드 |
UserDefaults.standard.object(forKey:) | UserDefaults에서 key에 해당하는 값을 반환하는 메서드 |
UserDefaults.standard.removeObject(forKey:) | UserDefaults에서 key에 해당하는 값을 제거하는 메서드 |
2. 주요 메서드의 매개변수
2.1. set(_:forKey:)
- value: 저장하려는 값
- key: 해당 값과 연관된 key
2.2. object(forKey:) → Any?
- key: 찾으려는 값과 연관된 key
2.3. removeObject(forKey:)
- key: 제거하려는 값과 연관된 key
2. 코드 예시
// 데이터 저장
UserDefaults.standard.set("value", forKey: "key")
// 데이터 불러오기
if let value = UserDefaults.standard.string(forKey: "key") {
// 데이터 처리
}
3) AppGroup(FileManager)
💡 AppGroup 이란?
- 같은 개발자 계정에 속한 앱들이 데이터를 공유할 수 있도록 해줍니다.
- AppGroup으로 저장 가능한 데이터 유형은 UserDefaults와 유사하지만, 추가적으로 파일을 저장할 수 있습니다.
💡 FileManager 란?
- iOS에서 파일과 디렉토리를 관리하는 데 사용되는 클래스 중 하나이며 iOS 앱에서 파일 및 디렉터리를 생성, 복사, 이동, 삭제하는 등의 작업을 수행할 수 있습니다. 또한, 파일의 내용을 읽고 쓰는 것과 같은 파일 작업도 수행할 수 있습니다.
- FileManager 클래스는 iOS에서 파일 및 디렉토리의 경로를 가져오는 데에도 사용됩니다. 이 클래스를 사용하면 iOS 앱에서 파일을 보관하고 관리하는 데 필요한 다양한 작업을 수행할 수 있습니다.
1. 주요 메서드
메서드 | 기능 |
FileManager.default.containerURL(forSecurityApplicationGroupIdentifier:) | 컨테이너 디렉토리 URL 가져오기 |
FileManager.default.createFile(atPath:contents:attributes:) | 파일 쓰기 |
FileManager.default.contents(atPath:) | 파일 읽기 |
FileManager.default.removeItem(at:) | 파일 삭제 |
2. 주요 메서드의 매개변수
2.1. containerURL(forSecurityApplicationGroupIdentifier groupIdentifier: String) -> URL?
- groupIdentifier: 공유 컨테이너의 식별자
2.2. createFile(atPath path: String, contents data: Data?, attributes attr: [FileAttributeKey : Any]?) -> Bool
- path: 파일 경로
- data: 파일에 쓰일 데이터
- attr: 파일 속성
2.3. contents(atPath path: String) -> Data?
- path: 파일 경로
2.4. removeItem(at URL: URL) throws
- URL: 파일 경로
2. 코드 예시
// 데이터 저장
let fm = FileManager.default
if let url = fm.containerURL(forSecurityApplicationGroupIdentifier: "groupIdentifier") {
let fileUrl = url.appendingPathComponent("fileName")
let data = "value".data(using: .utf8)
try? data?.write(to: fileUrl)
}
// 데이터 불러오기
if let url = fm.containerURL(forSecurityApplicationGroupIdentifier: "groupIdentifier") {
let fileUrl = url.appendingPathComponent("fileName")
let data = try? Data(contentsOf: fileUrl)
if let value = String(data: data ?? Data(), encoding: .utf8) {
// 데이터 처리
}
}
4) 저장소 비교
특징 | NotificationCenter | UserDefaults | AppGroup (FileManager) |
사용 목적 | 애플리케이션 내 객체 간 데이터 브로드캐스팅 목적으로 사용됨 | 간단한 데이터를 저장하고 관리할 때 사용됨 | 애플리케이션 및 해당 확장 프로그램 간 데이터 공유를 위해 사용됨 |
데이터 유형 | 모든 유형 | 기본 유형, 배열, 사전 및 데이터 | 공유 컨테이너에 저장된 파일 및 데이터 |
저장 위치 | 앱 내부 메모리에 저장이 됩니다. | 데이터가 앱 내에 저장이 됩니다. ~/Library/Preferences/{Bundle Identifier}.plist |
데이터가 앱 내에 저장이 됩니다. ~/Library/Group Containers/{Group Identifier}/shared/{file name} |
저장 제한 | 데이터를 저장하는것이 아닌 메모리에 저장하기에 저장 용량 제한이 없습니다. | 기본적으로 약 4KB의 용량 제한이 있으며, 이는 사용자가 iOS 기기에서 설정한 용량 제한에 따라 달라질 수 있습니다. | 앱 그룹을 사용하여 공유되는 파일 시스템의 용량 제한은 기기의 용량 제한에 따라 달라집니다. |
동기화 | 옵저버를 등록한 객체에 대해 데이터 갱신이 발생할때 동기화 수행 | 자동으로 동기화됨 | 자동으로 동기화됨 |
사용 예시 | 이벤트 발생 시 다른 객체들에게 전달할때 사용 | 앱의 사용자 정보 및 설정 정보를 받는데 사용 | 앱 그룹을 이용하여 두 개 이상의 앱에서 동일한 파일을 공유하거나, 데이터를 공유하는 경우에 사용됩니다. |
오늘도 감사합니다. 😀
반응형
'Swift > 이해하기' 카테고리의 다른 글
[Swift] UserDefaults 이해하고 Observer 구성하기 : Extention과 app의 통신 (0) | 2023.05.09 |
---|---|
[Swift] UIViewController 라이프사이클 이해하기 (0) | 2023.05.09 |
[Swift] iOS 앱 상태 이해 및 백그라운드로 이동방법 : 앱 라이프 사이클, 앱 벗어나기 (1) | 2023.04.25 |
[Swift] 화면 공유 기술 - 3 : 전체 시스템 화면 공유 개발 (3) | 2023.03.10 |
[Swift] 화면 공유 기술 - 2 : 전체 시스템 화면 공유 구축 (0) | 2023.03.10 |