2016-07-29 4 views
1

Вот объект, совместимый с NSCoding. Я хотел бы сохранить и восстановить его из каталога документов приложения в Swift 3. Я предполагаю, что это метод сохранения и метод восстановления. Как это делается?Как использовать persist & retrieve объект, совместимый с 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") 
    } 
} 

Thank you!

+0

'NSKeyedArchiver' /' NSKeyedUnarchiver' – dan

+0

Я понимаю, что вы используете NSKeyedArchiver/NSKeyedUnarchiver, но я не понимаю, как получить ссылку на каталог DOCS и код, чтобы сохранить его. Я весь день подпрыгивал вокруг документов и Интернета. – Aaronium112

ответ

1

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

Загрузка:

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

Вот тот же дизайн с помощью инструкций охраны.

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 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^