Миграция в архивированные данные из архива RootObject - PullRequest
0 голосов
/ 02 октября 2019

У меня есть два файла модели swift ниже.

// Item.swift

import UIKit

class Item: NSObject, NSCoding {
    var name: String
    var valueInDollars: Int
    var serialNumber: String?
    let dateCreated: Date
    let itemKey: String

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "name")
        aCoder.encode(dateCreated, forKey: "dateCreated")
        aCoder.encode(itemKey, forKey: "itemKey")
        aCoder.encode(serialNumber, forKey: "serialNumber")

        aCoder.encode(valueInDollars, forKey: "valueInDollars")
    }

    required init(coder aDecoder: NSCoder) {
        name = aDecoder.decodeObject(forKey: "name") as! String
        dateCreated = aDecoder.decodeObject(forKey: "dateCreated") as! Date
        itemKey = aDecoder.decodeObject(forKey: "itemKey") as! String
        serialNumber = aDecoder.decodeObject(forKey: "serialNumber") as! String?

        valueInDollars = aDecoder.decodeInteger(forKey: "valueInDollars")

        super.init()
    }
}
// ItemStore.swift

import UIKit

class ItemStore {

    var allItems = [Item]()
    let itemArchiveURL: URL = {
        let documentsDirectories =
            FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentDirectory = documentsDirectories.first!
        return documentDirectory.appendingPathComponent("items.archive")
    }()

    func saveChanges() -> Bool {
        print("Saving items to: \(itemArchiveURL.path)")
        return NSKeyedArchiver.archiveRootObject(allItems, toFile: itemArchiveURL.path)
    }
}

Эти два файла модели подтверждают протокол NSCoding и используют archiveRootObject для архивирования данных.

Но archiveRootObject являетсяустарел, и NSCoding не так безопасен, как NSSecureCoding, как я могу настроить код для настройки всех этих параметров?

1 Ответ

0 голосов
/ 02 октября 2019

Вы можете переписать вашу saveChanges функцию примерно так:

    func saveChanges() -> Bool {
        print("Saving items to: \(itemArchiveURL.path)")
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: allItems, requiringSecureCoding: false)
            try data.write(to: itemArchiveURL)
        }
        catch {
            print("Error archiving data: \(error)")
            return false
        }
        return true
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...