Как решить проблему устаревания unarchiveObject (withFile :) - PullRequest
0 голосов
/ 01 ноября 2018

В iOS 12.1 unarchiveObject(withFile:) устарело.
Как преобразовать NSKeyedUnarchiver.unarchiveObject(withFile: String) для использования вызова в NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data: Data), или NSKeyedUnarchiver.unarchivedObject(ofClasses: [AnyClass], из: данных), или NSKeyedUnarchiver.unarchivedObject(ofClass: NSCoding.Protocol, from: Data)?

Полагаю, вам нужно что-то вроде let fileData = try Data(contentsOf: URL), а затем использовать один из этих методов для разархивирования данных. Но я не могу понять это, и документация, сопровождающая амортизацию, не помогает (по крайней мере, мне).

Архивированные данные довольно просты - это просто массив строк (массив класса NameToBeSaved, как определено в этом коде):

class NameToBeSaved: NSObject, NSCoding {
var name: String

init(userEnteredName: String) {
    self.name = userEnteredName
    super.init()
}

func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: "name")
}

required init?(coder aDecoder: NSCoder) {
    name = aDecoder.decodeObject(forKey: "name") as! String
    super.init()
}

Вот код, вызывающий unarchiveObject (withFile :) -

init() {
    if let archivedCategoryNames = NSKeyedUnarchiver.unarchiveObject(withFile: categoryNameArchiveURL.path) as? [NameToBeSaved] {
        allCategories += archivedCategoryNames
    } else {
        for category in starterCategories {
            let thisNewCategory = NameToBeSaved(userEnteredName: category)
            createNewCategory(thisNewCategory)
        }
        sortCategories()
    }
}

Ответы [ 2 ]

0 голосов
/ 20 июля 2019

Проблема: разархивировать файл sks для использования в качестве SKEmitterNode.

СТАРЫЙ МЕТОД, УСТАРЕЛО:

let filePath = Bundle.main.path(forResource: "myParticleEmitter", ofType: "sks")!
let burnerPathUnarchived = NSKeyedUnarchiver.unarchiveObject(withFile: burnerPath) as! SKEmitterNode

НОВЫЙ МЕТОД:

do {
    let fileURL = Bundle.main.url(forResource: "myParticleEmitter", withExtension: "sks")!
    let fileData = try Data(contentsOf: fileURL)
    let unarchivedData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(burnerData) as! SKEmitterNode
} catch {
    print("didn't work")
}

Тогда вы можете сделать:

mySKEffectNode.addChild(unarchivedData)
mySKSpriteNode.addChild(mySKEffectNode)
0 голосов
/ 01 ноября 2018

Я не знаю, является ли это лучшим решением, но это решило преобразование для меня (старый код закомментирован для сравнения):

    init() {

    do {
        let rawdata = try Data(contentsOf: categoryNameArchiveURL)
        if let archivedCategoryNames = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(rawdata) as! [NameToBeSaved]? {
            allCategories += archivedCategoryNames
        }
    } catch {
        print("Couldn't read file")
        for category in starterCategories {
            let thisNewCategory = NameToBeSaved(userEnteredName: category)
            createNewCategory(thisNewCategory)
        }
        sortCategories()
    }

/*        if let archivedCategoryNames = NSKeyedUnarchiver.unarchiveObject(withFile: categoryNameArchiveURL.path) as? [NameToBeSaved] {
            allCategories += archivedCategoryNames
        } else {
            for category in starterCategories {
                let thisNewCategory = NameToBeSaved(userEnteredName: category)
                createNewCategory(thisNewCategory)
            }
            sortCategories()
        }
 */
}
...