[IOS 로드맵] keyedArchiver

willis18·2021년 10월 12일
0

IOS 로드맵

목록 보기
44/109

keyedArchiver

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되었으니 흐름 참고만 하세용 ㅠㅠ

0개의 댓글