web-dev-qa-db-ja.com

unarchiveObject(withFile :)の非推奨を解決する方法

IOS 12.1では、unarchiveObject(withFile:)は廃止されました。
どのようにしてNSKeyedUnarchiver.unarchiveObject(withFile: String)を変換して、NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data: Data)、またはNSKeyedUnarchiver.unarchivedObject(ofClasses: [AnyClass]、からの呼び出しを使用できますか:Data)、またはNSKeyedUnarchiver.unarchivedObject(ofClass: NSCoding.Protocol, from: Data)

let fileData = try Data(contentsOf: URL)のようなものを用意し、それらのメソッドの1つを使用してデータをアーカイブ解除する必要があると思います。しかし、私はそれを理解することができず、減価償却に付随する文書は役に立たない(少なくとも私には)。

アーカイブされたデータはかなり単純です-文字列の配列(このコードで定義されているクラス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()
    }
}
11
Diskprotek

これが最良の解決策であるかどうかはわかりませんが、これは私のために変換を解決しました(古いコードは比較のためにコメントアウトされています):

    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()
        }
 */
}
4
Diskprotek

問題:SKEmitterNodeとして使用するためにsksファイルをアーカイブ解除します。

古い方法、非推奨:

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
Saam Barrager