2016-07-30 11 views
0

は、私がロードするのに数秒かかり、非常に大きな(500メガバイト).DAEファイルを持っているので、私は、バックグラウンドで一度それを読み込むと2つの同一のビューコントローラで再利用されなくなります。最初のコントローラは、モデルの罰金を示しているが、私はモーダル(また、モデルの罰金を示して)次のビューコントローラを提示し、それを閉じたときに、モデルは、なくなって最初のビューコントローラのシーンから削除されます。 SCNViewがクリーンアップされたときにノードを処分しようとしSceneKitしていますか?私は、私は2つのビューコントローラは、同じクラスの2つのインスタンスは、子ビューコントローラとして使用されているので、何が起こっているかを説明できるか他にわかりません。SCNNodeは

// CarLoader.swift 
class CarLoader { 
    private static let instance = CarLoader(); 

    var storedCar: SCNNode = SCNNode(); 
    var loaded: Bool = false; 
    var onReady:(car: SCNNode)->() = { (car: SCNNode) in } ; 

    private init(){} 

    class func load(onLoad:()->()){ 
     if CarLoader.instance.loaded { 
      onLoad(); 
      return; 
     } 
     dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) { 
      let scene = SCNScene(named: "Scenes.scnassets/export_test6.dae"); 
      dispatch_async(dispatch_get_main_queue()) { // 2 
       let nodeArray = scene!.rootNode.childNodes; 
       let centeringNode = SCNNode(); 
       for childNode in nodeArray { 
        centeringNode.addChildNode(childNode as SCNNode) 
       } 

       centeringNode.eulerAngles.x = -Float(M_PI/2); 

       var min = SCNVector3(), max = SCNVector3(); 
       let _ = centeringNode.getBoundingBoxMin(&min, max: &max); 

       let w = CGFloat(abs(max.x - min.x)); 
       let h = CGFloat(abs(max.y - min.y)); 
       //let l = CGFloat(abs(max.z - min.z)); 

       centeringNode.position.x = -min.x + -Float(w/2); 
       centeringNode.position.y = -min.y/2 + -Float(h/2); // it's still a little low in y, but we want it lower 
       centeringNode.position.z = 0; 

       CarLoader.instance.storedCar = centeringNode; 
       CarLoader.instance.loaded = true; 
       CarLoader.instance.onReady(car: centeringNode); 
       onLoad(); 
      } 
     } 
    } 
    class func cachedModel(onReady: (car: SCNNode) ->()) { 
     CarLoader.instance.onReady = onReady; 
     if CarLoader.instance.loaded { 
      CarLoader.instance.onReady(car: CarLoader.instance.storedCar); 
     } 
     else { 
      // callback is called when ready 
     } 
    } 
} 

答えて

0

名前を付けて、それがViewDidAppearの間にあるかどうかを調べることで、私はそれを回避しました。

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated); 
    // the car disappears in the Explorer when it reappears after the settings menu has been up 
    if self.carRootNode.childNodeWithName(CarLoader.CarModelNodeName, recursively: false) == nil { 
     self.insertCarModel(); 
    } 
} 
関連する問題