NSkeyedArchiver도 Codable, PList, UserDefaults, JSON 같은
데이터오브젝트를 직렬화 하는데 쓰입니다.
NSKeyedArchiver와 NSKeyedUnarchiver가 키포인트 입니다.
NSKeyedUnarchiver는 Codable과 비슷한데
흠 일단 개념을 줄줄 설명하는거 보다 코드로 대화하죠
간단하게 이놈도 결국 데이터 저장을 위해 쓰이는놈이고 인코딩, 디코딩 방식이며 심지어 오래오래전부터 쓰이던 방식이라는 거죠 ios 2.0이후부터로 쓰이던 놈이였으니
상위 문서는 NSCoder입니다.
공식문서 링크 : https://developer.apple.com/documentation/foundation/nskeyedarchiver
class Book {
var title:String
var author:String
var published:Int
init(title: String, author: String, published: Int) {
self.title = title
self.author = author
self.published = published
}
}
클래스로 북을 선언 해놓았습니다.
let books = [
Book(title: "Nineteen Eighty-Four: A Novel", author: "George Orwell", published: 1949),
Book(title: "Brave New World", author: "Aldous Huxley", published: 1932),
Book(title: "Mona Lisa Overdrive", author: "William Gibson", published: 1988),
Book(title: "Ready Player One", author: "Ernest Cline", published: 2011),
Book(title: "Red Rising", author: "Pierce Brown", published: 2014)
]
미리 books라는 배열에 집어 넣어 놔 뒀구요
class Book: NSObject, NSCoding {
required convenience init?(coder: NSCoder){
guard let title = coder.decodeObject(forKey: "title") as? String,
let author = coder.decodeObject(forKey: "author") as? String
else { return nil }
self.init(
title: title,
author: author,
published: coder.decodeInteger(forKey: "published")
)
}
func encode(with coder: NSCoder) {
coder.encode(title, forKey: "title")
coder.encode(author, forKey: "author")
coder.encode(published, forKey: "published")
}
}
book클래스를 위처럼 상속, 프로토콜을 받고
아래 init과 encode를 채워야합니다.
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("books")
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: books, requiringSecureCoding: false)
try data.write(to: path)
} catch {
print("ERROR: \(error.localizedDescription)")
}
데이터를 저장하고 archiver를 위한 코드
let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("books")
do {
let data = try Data(contentsOf: path)
if let books = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [Book] {
print(books)
}
} catch {
print("ERROR: \(error.localizedDescription)")
}
그리고 데이터를 불러오고 unarchiver하는 코드입니다.
for book in books {
print("\(book.title) -- \(book.author)")
}
마무리로 for문을 통해 가져온 데이터를 출력하는 코드입니다.
출처 : https://learnappmaking.com/storing-data-nscoding-nskeyedarchiver-swift-how-to/#adopting-nscoding-in-swift
영어로 되어있어서 간단하게 가져와 봤습니다
자세한 설명을 보고 싶으시면 링크를 참고해 주세요
아래 링크는 한글로 작성해 주신 분꺼인데 위 방법과는 살짝? 다른느낌?
특히 저장할때 위 튜토리얼은 .write를 썻는데 이분은 안쓰고 하시는 무슨 차이인지는 아직 모르겟지만 한글로 참고용으로 링크 남겨놉니다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yuyyulee&logNo=220930047790
ps. 공식문서를 보니 윗분이 저장할때 쓰신 class func archiveRootObject(Any, toFile: String) -> Bool
Deprecated되었으니 흐름 참고만 하세용 ㅠㅠ