본문 바로가기

개발/Swift

[Swift] 객체 저장 - Archiving

반응형

Archiving

UserDefaults의 문제는 작은 데이터만 다루는 것과 속성 리스트만 가능하다는 점이다.
만약 저장하고자 하는 데이터가 매우 크거나 속성 리스트가 아닌 것을 포함하고 있다면,
아카이브를 사용하면 된다!

아카이브에는  NSCoder와 Codable를 이용한 두 가지 매커니즘이 있다.

 

NSCoder

NSCoder는 저장하고자 하는 모든 객체를 하나의 객체 그래프로 영구 저장한다. 

func encode(with aCoder: NSCoder)
init(coder: NSCoder)

encode를 통해 값을 저장하고 init(coder: )에서 객체를 초기화 할 수 있다.
이 함수는 객체 그래프 내에 있는 모든 객체에 호출되어 큰 딕셔너리 안에 넣어지게 된다.

주로 하는 일은 객체를 데이터로 바꾸는 일이다. 
객체를 데이터로 바꿔야 파일 시스템에 저장할 수 있다.
물론 데이터를 저장하기도 하고 읽기도 한다.

모든 객체 그래프의 객체들을 데이터로 바꾸는 작업은 NSKeyedArchiver로 할 수 있다.
NSKeyedArchiver는 객체와 객체가 가르키는 것에서 전체 객체 그래프와 모인 것들을 담은 데이터를 반환한다.

 

Codable

Codable은 Decodable과 Encodable 두가지 프로토콜을 가진다.
NSCoder의 메소드도 거의 비슷한데 다른 점은 Objective-c가 아닌 Swift에서 구현한 것이고 런타임이 다르다.
Foundation이 두 메소드를 거의 대부분 구현해준다.
Swift에서 기본 타입들만 사용한다면 (URL, String, Bool, CGFloat, IndexPath... 등) 문제없이 실행된다.
그러면 객체를 데이터로 바꾸는 방법에 대해 알아보자. 

let object: MyType = ...
let jsonData: Data? = try? JSONEncoder().encode(object)

 

임의의 데이터로 바꾸는 것 대신 우리가 아는 JSON과 같은 모양으로 인코드한다.
(+ JSON은 인터넷의 것들을 설명하거나 데이터를 전달하는 텍스트 포맷.)
큰 객체 그래프를 JSON을 사용해 나타낼 수 있다.
다른 인코더도 JSON대신 속성 리스트로 만들 수 있다.

직접 정의한 MyType 객체 하나를 가지는데 그 타입이 Codable이면 된다.
객체가 Codable이고 이 안에 저장된 것들이 Codable이면 이 객체를 JSON 데이터로 인코딩할 수 있다.
조건이 맞다면 데이터 BLOB가 반환되는데, BLOB안에는 모든 객체 그래프의 JSON 표현이 들어 있다.

let jsonString = String(data: jsonData!, encoding: .utf8_ // JSON는 항상 utf8

JSON으로 된 BLOB 데이터를 문자열로 확인해보고 싶은 경우에는 위와 같이 쓰면 된다.
(+ .utf8은 유니코드 8비트 인코딩을 의미한다.)

if let myObject: MyType = try? JSONDecoder().decode(MyType.self, from: jsonData!) {  }

만약 모든 개체 그래프의 JSON 표현을 가지고 있고, 이걸 객체 그래프로 만들고 싶다면 JSON 디코더를 쓰면 된다.

Decoder에서 에러가 나타날 확률이 높은데 보통 JSON 데이터가 손상되었을 경우 자주 뜬다. 
웹사이트로부터 표준 JSON을 이용해서 코드의 객체로 바꾼다면 일대일 매칭으로 쉽게 실행할 수 있다. 

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601

JSON에는 날짜 타입이라는 개념이 없다.  
디코더는 디코딩 전략과 날짜 JSON파일에 저장된 날짜를 해독할 수 있으니 위와 같이 잘 써보자.

 

반응형

'개발 > Swift' 카테고리의 다른 글

[Swift] Core Data 알아보기 (1)  (0) 2021.03.01
[Swift] File System  (0) 2021.03.01
[Swift] 객체 저장 - UserDefaults  (0) 2021.02.28
[Swift] Multithreading  (0) 2021.02.26
[Swift] DispatchQueue 종류  (0) 2021.02.26