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

核能气质少年 提交于 2019-12-01 12:07:35

Saving:

// 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)
}

Loading:

// 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
}

Here's the same design using guard statements.

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
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!