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
}
}
}