如何在 Swift 3 中使用 persist 和检索 NSCoding 兼容对象到应用程序文档目录?

How to use persist & retrieve an NSCoding compliant object to app Document directory in Swift 3?

这是一个符合 NSCoding 的对象。我想从 Swift 中的应用程序的文档目录中保存和恢复它 3. 我想这是一个保存方法和恢复方法。这是怎么做到的?

import Foundation

class Book: NSObject, NSCoding {
    var title: String
    var author: String
    var pageCount: Int
    var categories: [String]
    var available: Bool

    init(title:String, author: String, pageCount:Int, categories:[String],available:Bool) {
        self.title = title
        self.author = author
        self.pageCount = pageCount
        self.categories = categories
        self.available = available
    }

    // MARK: NSCoding
    required convenience init?(coder: NSCoder) {

        let title = coder.decodeObject(forKey: "title") as! String
        let author = coder.decodeObject(forKey: "author")as! String
        let categories = coder.decodeObject(forKey: "categories") as! [String]
        let available = coder.decodeBool(forKey: "available")
        let pageCount = coder.decodeInteger(forKey: "pageCount")

        self.init(title:title, author:author,pageCount:pageCount,categories: categories,available:available)
    }

    func encode(with: NSCoder) {
        with.encode(self.title, forKey: "title")
        with.encode(self.author, forKey: "author")
        with.encode(Int32(self.pageCount), forKey: "pageCount")
        with.encode(self.categories, forKey: "categories")
        with.encode(self.available, forKey: "available")
    }
}

谢谢!

节省:

// Get documents directory
if let docs = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {

    // Append your file name to the directory path
    let path = (docs as NSString).appendingPathComponent("filename")

    // Archive your object to a file at that path
    NSKeyedArchiver.archiveRootObject(yourObject, toFile: path)
}

正在加载:

// Get documents directory
if let docs = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {

    // Append your file name to the directory path
    let path = (docs as NSString).appendingPathComponent("filename")

    // Unarchive your object from the file
    let yourObject = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? Book

    // do whatever with yourObject
}

这是使用保护语句的相同设计。

import UIKit
import MediaPlayer

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let book = Book(title: "Atlas Shrugged", author: "Ayn Rand", pageCount: 10, categories: ["Ethics"], available: true)
        save(object: book, filename: "Bookshelf")

        let atlasShrugged = retrieve(filename: "Bookshelf") as! Book
        print("\(atlasShrugged.title) by \(atlasShrugged.author)")
    }

    func save(object:NSObject ,filename:String){

        //build filepath in doc directory
        guard let docs = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else { return }
        let path = (docs as NSString).appendingPathComponent(filename)

        //save object to path in docs
        NSKeyedArchiver.archiveRootObject(object, toFile: path)
    }

    func retrieve(filename:String) -> AnyObject? {

        // Get documents directory
        guard let docs = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else { return nil }
        //build path to file
        let path = (docs as NSString).appendingPathComponent(filename)
        //Unarchive from doc directory
        let object = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? Book
        return object
    }