-
210425 - TILTIL/2021 2021. 4. 26. 01:22
PropertyList
- xml로 만들어져 있다.
- OpenAS - sourceCode로 보면 xml로 보인다,
- Key와 Value를 한 쌍으로
- new에서 PropertyList를 생성해 새로 추가할 수 도 있다.
- 하나의 Root에 data들을 추가를 시켜야 한다.
- 저장한 data는 Bundle에 추가된다.
- Bundle에 추가되는 data들은 읽기 전용이다.
- NSDictionary나 NSArray로 저장된 data를 읽어올 수 있다.
- FileManager로 File에 추가하고 불러올 때 decoder는 PropertyListDecoder()를 사용하면 된다.
- 저장할 때는 PropertyListEncoder()를 사용하면 된다.
- Codable을 채용한 형식으로도 encode, decode 할 있다.
Class, Struct를 file로 저장하고 불러오기
NSCoding
- Protocol
- 객체를 file로 저장할 때에는 NSKeyedArchiver를 이용하고 archiveRootObject(_:toFile:) 메서드를 호출하여 객체
- 이때 NSCoding프로토콜을 채용한 형식 이어야 한다.
- encode에서는 파라미터로 제공되는 aCoder를 이용하여 key, value를 전달하면 된다.
- docode에서도 마찬가지로 aDecoder를 이용하면 된다.
- 이때 decodeObject(forKey:) 메서드의 return이 Any이기 때문에 typecasting이 필요하다.
- 그리고 NsObject도 상속을 해야 한다.
- 안 하면 crash 발생
- 단점은 struct를 저장하지 못한다.
- 왜냐면 NSObject를 상속해야 하니까!
- 그럼 struct는??
- Decodable, Encodable을 채용하면 된다.
- File을 읽을 때는 NSKeyedUnarchiver를 이용하고 unarchiveObject(with:) 메서드를 이용한다.
- 마찬가지로 Any이기 때문에 typeCasting 해야 한다.
- 보안 문제를 해결하기 위해 NSSecureCoding이 생겼다.
- NSSecureCoding 프로토콜을 채용시키고 required 하나만 override 해준다.
- decodeObject를 사용하면 형식을 정해서 보낼 수 있다.
- 근데 이 메서드에 첫 번째 파라미터로는 struct를 보낼 수 없다.
- encode도 archivedData(withRootObject:requiringSecureCoding:)으로 해야 한다.
- Decode 할 때는 unarchiveObject(with:) 대신 unarchivedObject(ofClass:from:)을 사용한다.
- root 에러가 난다고 뜰 수 있는데
- 이건 struct를 전달해서 그럴 수 있다, class로만 보내야 하기 때문에 String -> NSString, Int -> NSNumber로 바꿔야 한다.
Codable
- Encodable & Decodable이다,
- NSCoding, NSSecureCoding은 class 만 가능했다.
- struct도 가능해야지!
- init은 자동으로 제공된다.
- 기본형식들은 Codable을 채용하고 있고 모든 속성들이 Codable을 채용하고 있다면 멤버 구현을 생략할 수 있다.
- iOS 11.0 이상에서는 NSKeyedArchiver 속성을 이용한다.
- 그 이하라면 인스턴스를 생성한다.
- 꼭 encoding이 끝나면 finishEncoding()을 호출해야 한다
- Decoding는 NSKeyedUnarchiver를 사용한다.
- Class Struct 모두 가능하다
728x90'TIL > 2021' 카테고리의 다른 글
210427 - TIL (0) 2021.04.28 210426 - TIL (0) 2021.04.28 210422 - TIL (0) 2021.04.23 210421 - TIL (0) 2021.04.22 210419 - TIL (0) 2021.04.20