swift - 处理应用程序创建的一次性不可变数据

标签 swift scenekit saving-data

我正在重写我的应用程序以合并 SceneKit 来显示分子。我大约 60% 的代码致力于将这些分子创建为存储在字典中的 SCNNode 数组。另外 20% 创建了一个 String 字典用于文本显示。理想情况下,这些词典只需创建一次。

目前,我正在我的主要(和初始)VC 中通过来自 viewDidLoad 的调用来创建这些字典。然后我存档字典:

NSKeyedArchiver.archiveRootObject(moleculeDictionary, toFile: filePath)

然后我将存档的字典读回到应用程序使用的本地字典中:

moleculeDictionary = Molecules.readFile() as! [String: [SCNNode]]

// and in Molecules, the readFile() function:
let dictionary = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? NSDictionary ?? NSDictionary()
return dictionary

我从存档中读取它以防本地版本不再存在。我仍然需要检查字典是否存在。

我的问题:这是最好的方法吗?当然,这是许多程序的共同方面。我倾向于在开发过程中使用这些词典创建永久文件,并将它们包含在发布的包中。但是没有人回应我关于这方面的帖子,所以我认为每个人都以其他方式来做。我祈祷我不必了解 CoreData,但如果需要,请告诉我。

最佳答案

您可以单独使用场景文件和节点文件,将它们嵌入您的二进制文件中,而不是归档/加载多个节点树的字典数组。

如果是完整场景,把它放在你的Xcode项目中的art.scnassets文件夹中,然后加载它

        let scene = SCNScene(named: "art.scnassets/oneMolecule.scn")!

如果您存档了整个场景,包括节点、灯光、摄像机和 Action ,那么这是合适的。

你可以只归档一个节点树

let documentDirURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
if let gizmoNode = gameView.scene?.rootNode.childNodeWithName("Gizmo", recursively:true) {
    let gizmoData = NSKeyedArchiver.archivedDataWithRootObject(gizmoNode)
    let gizmoURL = documentDirURL.URLByAppendingPathComponent("Gizmo").URLByAppendingPathExtension("plist")
    print("gizmo path:", gizmoURL.path)
    if (!gizmoData.writeToURL(gizmoURL, atomically: true)) {
        return false
    }
}

如果您使用辅助 iOS 程序生成 Assets ,它们将位于模拟器文件层次结构中的 Documents 文件夹中。如果这些是由您的最终产品即时生成的,则它们属于缓存或临时文件夹,以便在需要时可以清除它们并且不会进行备份。

如果您要发布预构建节点,请将其像 PNG 一样放入您的项目中。获取它

let path = NSBundle.mainBundle().pathForResource("Gizmo", ofType: "plist")
print(path)
let gizmoNode = NSKeyedUnarchiver.unarchiveObjectWithFile(path!) as! SCNNode
print (gizmoNode)
scene.rootNode.addChildNode(gizmoNode)

还有一件事:构建和归档 SCNScenes 和 SCNNode 不需要 SCNView。您可以将节点生成代码提取到独立的命令行 Mac 程序中。构建你的节点树,单独归档它们。然后将它们放入场景中,将其存档,并使用场景编辑器进行预览。您可以自动化整个生成分子/复制/构建 iOS 应用程序的过程。

关于swift - 处理应用程序创建的一次性不可变数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35633854/

相关文章:

ios - UICollectionview 重新排序图像单元格

javascript - PHP 认为它正在写入 .txt 文件,但实际上不是

ios - 在缓存中保存 JSON 数据

ios - 设计UIView,使其可以根据内容高度动态改变其高度

swift - 多个异步测试和期望

objective-c - 将 SceneKit 场景导出为 Collada .dae 文件的最简单方法?

ios - SceneKit - 纹理显示不正确

swift - 以高性能方式获取 CVPixelBuffer(相机帧和 ar 模型)

android - 在android中恢复listView

ios - NSAttributedString 设置字体大小 - swift