[Swift]加载在运行时下载的 scn 文件时为零
[Swift]nil when loading scn files downloaded in runtime
我正在开展一个项目,通过扫描二维码将模型加载到 ARKit 支持的应用程序中。我有 qrCode 工作和 .scn 文件下载到 .tmp 文件中。然而,当我试图通过 SCNScene(url:) 捕捉场景时,所有 returns 都是零。
我想知道是否是因为我复制文件的时间太早了——在它完成下载之前,因为我扫描二维码后应用程序立即冻结了。
如有任何建议,我们将不胜感激。 :D
2017-11-18添加下载码
模板:http://www.jianshu.com/p/6ca4864b3600
func sessionSimpleDownload( scnurl: URL){
let url = scnurl
let request = URLRequest(url: url)
let session = URLSession.shared
var ls: String!
let downloadTask = session.downloadTask(with: request,
completionHandler: { (location:URL?, response:URLResponse?, error:Error?)
-> Void in
print("location:\(String(describing: location))")
let locationPath = location!.path
let documents:String = NSHomeDirectory() + "/Documents/max.scn"
ls = NSHomeDirectory() + "/Documents"
let fileManager = FileManager.default
if (fileManager.fileExists(atPath: documents)){
try! fileManager.removeItem(atPath: documents)
}
try! fileManager.moveItem(atPath: locationPath, toPath: documents)
print("new location:\(documents)")
})
downloadTask.resume()
self.Modelscene = SCNScene(named: "max.scn", inDirectory: ls)
}
你的下载码在哪里?在调用完成处理程序之前,您不应该尝试加载文件。在任何情况下,您都可以使用 FileManager.default.attributesOfItem(atPath: ) 检查文件大小,看看是否符合您的预期。
编辑:
您的问题是您在 downloadTask.resume()。这意味着您是在下载刚刚开始时打开场景,而不是在下载完成之后。您需要将场景分配放在完成处理程序中,以便在下载完成时发生。
我正在开展一个项目,通过扫描二维码将模型加载到 ARKit 支持的应用程序中。我有 qrCode 工作和 .scn 文件下载到 .tmp 文件中。然而,当我试图通过 SCNScene(url:) 捕捉场景时,所有 returns 都是零。
我想知道是否是因为我复制文件的时间太早了——在它完成下载之前,因为我扫描二维码后应用程序立即冻结了。
如有任何建议,我们将不胜感激。 :D
2017-11-18添加下载码
模板:http://www.jianshu.com/p/6ca4864b3600
func sessionSimpleDownload( scnurl: URL){
let url = scnurl
let request = URLRequest(url: url)
let session = URLSession.shared
var ls: String!
let downloadTask = session.downloadTask(with: request,
completionHandler: { (location:URL?, response:URLResponse?, error:Error?)
-> Void in
print("location:\(String(describing: location))")
let locationPath = location!.path
let documents:String = NSHomeDirectory() + "/Documents/max.scn"
ls = NSHomeDirectory() + "/Documents"
let fileManager = FileManager.default
if (fileManager.fileExists(atPath: documents)){
try! fileManager.removeItem(atPath: documents)
}
try! fileManager.moveItem(atPath: locationPath, toPath: documents)
print("new location:\(documents)")
})
downloadTask.resume()
self.Modelscene = SCNScene(named: "max.scn", inDirectory: ls)
}
你的下载码在哪里?在调用完成处理程序之前,您不应该尝试加载文件。在任何情况下,您都可以使用 FileManager.default.attributesOfItem(atPath: ) 检查文件大小,看看是否符合您的预期。
编辑: 您的问题是您在 downloadTask.resume()。这意味着您是在下载刚刚开始时打开场景,而不是在下载完成之后。您需要将场景分配放在完成处理程序中,以便在下载完成时发生。