【问题标题】:Handling one-time immutable data created by app处理应用创建的一次性不可变数据
【发布时间】:2016-02-25 17:11:24
【问题描述】:

我正在重写我的应用程序以结合 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,但如果是的话,请告诉我。

【问题讨论】:

    标签: swift scenekit saving-data


    【解决方案1】:

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

    如果是完整场景,请将其放在 Xcode 项目中的 art.scnassets 文件夹中,然后使用

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

    如果您存档了包含节点、灯光、相机和动作的整个场景,则该方法是合适的。

    您可以使用

    仅归档一棵节点树
    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 程序来生成资产,它们将位于模拟器文件层次结构中的 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)
    

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

    【讨论】:

    • 非常感谢,哈尔。一切都很好,在内存方面表现更好,并且使用更少的代码。您设法在一个回复中回答了我的三大问题。
    猜你喜欢
    • 2021-11-28
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2017-03-27
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多