NSInvalidUnarchiveOperationException в iOS 9.3 со SpriteKit

Итак, я делаю несколько небольших проектов для крупной игры, которую я разрабатывал, но, не зная почему, каждый раз, когда я пытаюсь запустить свою игру, появляется сообщение об ошибке SIGABRT со следующим сообщением:

* Завершение работы приложения из-за необработанного исключения 'NSInvalidUnarchiveOperationException', причина: '* -[NSKeyedUnarchiver decodeObjectForKey:]: невозможно декодировать объект класса (GameScene) для ключа (root); класс может быть определен в исходном коде или в несвязанной библиотеке.

Я добавил следующее расширение в SKNode

    extension SKNode {
    class func unarchiveFromFile(_ file: NSString) -> SKNode? {
        if let path = Bundle.main().pathForResource(file as String, ofType: "sks") {
            do {
                let sceneData = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.dataReadingMappedIfSafe)
                let archiver = NSKeyedUnarchiver(forReadingWith: sceneData)
                archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
                let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
                archiver.finishDecoding()
                return scene
            } catch {
                print("ERROR1002")
                return nil
            }
        } else {
            print("ERROR001 - pathForResource not found")
            return nil
        }
    }
}

Я использовал это расширение в других проектах, и все работало как по маслу, но теперь на этом.

Когда моя игра запускается, вызывается мой файл GameViewController.swift, и в моем методе viewDidLoad я делаю следующее:

import UIKit
import SpriteKit
import GameplayKit




class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let scene = GameScene.unarchiveFromFile(currentSKSFile) as? GameScene {

            // Configure the view.
            let skView = self.view as! SKView
            skView.showsFPS = false
            skView.showsNodeCount = false

            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true

            /* Set the scale mode to scale to fit the window */
            scene.scaleMode = .aspectFill

            skView.presentScene(scene)
        }
    }


    override func shouldAutorotate() -> Bool {
        return true
    }

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if UIDevice.current().userInterfaceIdiom == .phone {
            return .landscape
        } else {
            return .all
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
        print("didReceiveMemoryWarning ERRO - GameViewController.swift")
    }

    override func prefersStatusBarHidden() -> Bool {
        return true
    }

}

Я отладил код, и он падает на следующей строке в добавленном мною классе расширения:

пусть сцена = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) как! GameScene

И выдает ошибку, описанную выше.

Я запускаю Xcode 8 Beta + iOS 10, и нет, это не из-за этого, потому что я могу запускать точно такое же расширение, которое используется в других проектах, на устройствах такого типа с бета-версиями без каких-либо ошибок.

Любая подсказка о том, что может быть причиной этого?

С уважением - Иван


person Ivan Cantarino    schedule 17.06.2016    source источник


Ответы (1)


Каким-то образом очистка моего проекта решила мои проблемы!

Я пробовал разные вещи, и ошибки были там, поэтому я очистил его, и ошибки больше не было.

Я не знаю, почему это произошло, но это решено.

Спасибо, в любом случае :)

person Ivan Cantarino    schedule 27.06.2016