1. 저장, 불러오기
앱에서 만들었던 객체들을 Data로 저장하고 다시 불러오고 싶은 경우가 있을 것이다.
이런 경우 사용하는 것이 NSCoding 프로토컬이다.
2. Encode와 Decode
NSCoding 프로토컬을 보면 Data로 저장할 때 쓰는 encoding과, Data에서 불러올 때 쓰는 init? method가 있다.
사용법은 필요한 타입에 이 프로토컬을 상속받아 사용하면 된다.
3. 기본 사용 예제
class Shape : NSObject, NSCoding {
private var identifier : String
...생략...
func encode(with aCoder: NSCoder) {
aCoder.encode(identifier, forKey: "identifier")
}
required init?(coder aDecoder: NSCoder) {
guard let identifier = aDecoder.decodeObject(forKey: "identifier") as? String else {
return nil
}
self.identifier = identifier
}
}
여기서 forKey는 사용자 마음대로 정할 수 있으나, 일반적으론 프로퍼티의 이름을 그대로 쓰는 것 같다.
4. 심화 사용 예제
위 예제와 같이 String 등 지원하는 타입을 사용할 경우 위와 같이 편리하게 사용할 수 있다.
그런데 아래와 같이 우리가 새롭게 만든 타입을 사용하는 경우는 조금 다르다.
class Shape : NSCoding {
private var identifier : String
private var point : CustomPoint
...생략...
func encode(with aCoder: NSCoder) {
guard let point = try? JSONEncoder().encode(self.CustomPoint) {
return
}
aCoder.encode(identifier, forKey: "identifier")
aCoder.encode(point, forKey: "point")
}
required init?(coder aDecoder: NSCoder) {
guard let identifier = aDecoder.decodeObject(forKey: "identifier") as? String,
let pointJSONData = aDecoder.decodeObject(forKey: "point") as? Data,
let point = try? JSONDecoder().decode(CustomPoint.self, from: pointJSONData) else {
return nil
}
self.identifier = identifier
self.point = point
}
이런 식으로, encode, decode 과정에서 한번씩 더 값을 가져오는 과정을 필요로 한다.
그리고 당연히, 우리가 새롭게 만든 타입인 CustomPoint에도 위와 같이 NSCoding을 사용하여 encode/decode가 가능하도록 해주어야 한다.
만약 CustomPoint가 Struct이라면 Codable을 사용해서 해결할 수 있다.
아래 글을 참고하자.
2023.10.01 - [IOS] - [iOS] struct도 encoding을 해야한다.
[iOS] struct도 encoding을 해야한다.
1. 문제 상황 1-1) shape 객체를 아카이빙하려고 하였다. class Shape : NSObject, NSCoding { private var identifier : String private var point : Point private var size : Size } 1-2) 그런데 encode이 매번 실패하였다. 디버거로 확
pushedgun.tistory.com
'🍎 Apple > iOS' 카테고리의 다른 글
[iOS] assertionFailure, 배포버전에선 터지지 않도록 하기 (0) | 2023.10.26 |
---|---|
[iOS] designated init, convenience init 은 대체 뭘까?? (0) | 2023.10.22 |
[iOS] required init?(coder: NSCoder) 이게 뭔데 자꾸 만들어줘 (0) | 2023.10.22 |
[iOS] 어디서 문제가 생긴걸까?? Log를 찍어보자. (0) | 2023.10.05 |
[iOS] struct도 encoding을 해야한다. (0) | 2023.10.01 |