Dis*_*tek 11 nskeyedarchiver ios swift
在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()
}
Run Code Online (Sandbox Code Playgroud)
这是调用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()
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是最好的解决方案,但这为我解决了转换(旧代码注释掉以进行比较):
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()
}
*/
}
Run Code Online (Sandbox Code Playgroud)
Swift 5,删除前缀“NS”并集中使用以供将来的更改...
class KeyedUnarchiver : NSKeyedUnarchiver {
open override class func unarchiveObject(with data: Data) -> Any? {
do {
let object = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSObject.self], from: data)
return object
}
catch let error {
Swift.print("unarchiveObject(with:) \(error.localizedDescription)")
return nil
}
}
open override class func unarchiveObject(withFile path: String) -> Any? {
do {
let data = try Data(contentsOf: URL.init(fileURLWithPath: path))
let object = try unarchivedObject(ofClasses: [NSObject.self], from: data)
return object
}
catch let error {
Swift.print("unarchiveObject(withFile:) \(error.localizedDescription)")
return nil
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题:取消归档 sks 文件以用作 SKEmitterNode。
旧方法,已弃用:
let filePath = Bundle.main.path(forResource: "myParticleEmitter", ofType: "sks")!
let burnerPathUnarchived = NSKeyedUnarchiver.unarchiveObject(withFile: burnerPath) as! SKEmitterNode
Run Code Online (Sandbox Code Playgroud)
新方法:
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")
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
mySKEffectNode.addChild(unarchivedData)
mySKSpriteNode.addChild(mySKEffectNode)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3146 次 |
| 最近记录: |