gpt4 book ai didi

ios - 从 SCNScene url 获取下载进度

转载 作者:行者123 更新时间:2023-11-28 14:48:43 28 4
gpt4 key购买 nike

我正在使用 ARKit,我无法从 SCNScene url 获取下载进度。这是我的代码:

func downloadModel(hitTestResult: ARHitTestResult) {
DispatchQueue.global().async {
// create loading view
// I WANT TO GET DOWNLOAD PROGRESS HERE
let loading = UIAlertController(title: nil, message: "Please wait...\(downloadProgressValueHere)%", preferredStyle: .alert)

let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating();

loading.view.addSubview(loadingIndicator)
self.present(loading, animated: true, completion: nil)

// download 3d model from server
let myURL = URL(string: "http://www.mydownloadlink.com")
let scene = try! SCNScene(url: myURL!, options: nil)
let node = (scene.rootNode.childNode(withName: "parentNode", recursively: true))!
self.sceneView.scene.rootNode.addChildNode(node)

// dismiss loading view
loading.dismiss(animated: true, completion: nil)
}
}

如何获取“请稍候...”消息的下载进度?谢谢大家。

最佳答案

据我了解,虽然看起来以下方法会采用远程 URL,但实际上它不会(尽管我可能是错的):

convenience init(url: URL, 
options: [SCNSceneSource.LoadingOption : Any]? = nil) throws

无论如何,这里回答您的问题是您的示例(可能有点 OTT,但希望它也能帮助其他人)。

假设我们在以下 URL 处有一个 SCNScene 文件:

http://stackOverflow.com/stackOverFlow.scn

首先我们需要为 ProgressInfo 创建变量,如下所示:

 var loading: UIAlertController!
var loadingIndicator: UIActivityIndicatorView!
var downloadString: String = "Downloading"

然后我们要做的是创建一个 URLSession 来下载文件,如下所示:

 /// Downloads An SCNFile From A Remote URL
func downloadSceneTask(){

//1. Get The URL Of The SCN File
guard let url = URL(string: "http://stackOverflow.com/stackOverFlow.scn") else { return }

//2. Create The Download Session
let downloadSession = URLSession(configuration: URLSession.shared.configuration, delegate: self, delegateQueue: nil)

//3. Create The Download Task & Run It
let downloadTask = downloadSession.downloadTask(with: url)
downloadTask.resume()

//4. Show The Progress Alert
DispatchQueue.main.async {

self.loading = UIAlertController(title: nil, message: self.downloadString , preferredStyle: .alert)

let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50))
loadingIndicator.hidesWhenStopped = true
loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
loadingIndicator.startAnimating();

self.loading.view.addSubview(loadingIndicator)
self.present(self.loading, animated: true, completion: nil)
}

}

请注意,我创建了一个 variable caused downloadString,我们稍后会更改它。

然后我们将引用以下 URLSession 委托(delegate),例如:

class ViewController: UIViewController, URLSessionDelegate, URLSessionDownloadDelegate {

}

对于我们的示例,它将调用以下函数:

第一个跟踪我们的下载进度,您可以在其中处理诸如在 HUD 中显示进度或使用 progressIndicator 之类的事情:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {

print("Downloaded \(totalBytesWritten) / Of \(totalBytesExpectedToWrite) Bytes")

DispatchQueue.main.async {
self.loading.message = "Downloaded \(totalBytesWritten) / Of \(totalBytesExpectedToWrite) Bytes"
}

}

文件下载完成后处理的第二个:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {

//1. Remove The Loading View
loading.dismiss(animated: true, completion: nil)

//2. Create The Filename
let fileURL = getDocumentsDirectory().appendingPathComponent("stackOverFlow.scn")

//3. Copy It To The Documents Directory
do {
try FileManager.default.copyItem(at: location, to: fileURL)

print("Successfuly Saved File \(fileURL)")

//4. Load The Model
loadModel()

} catch {

print("Error Saving: \(error)")
}
}

请注意,在此方法中,我使用以下函数来检索下载的文件并将其复制到 documents 目录:

/// Returns The Documents Directory
///
/// - Returns: URL
func getDocumentsDirectory() -> URL {

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory

}

文件下载并复制后,我们 (4) 调用我们的 loadModel 函数,如下所示:

/// Loads The SCNFile From The Documents Directory
func loadModel(){

//1. Get The Path Of The Downloaded File
let downloadedScenePath = getDocumentsDirectory().appendingPathComponent("stackOverFlow.scn")

do {

//2. Load The Scene Remembering The Init Takes ONLY A Local URL
let modelScene = try SCNScene(url: downloadedScenePath, options: nil)

//3. Create A Node To Hold All The Content
let modelHolderNode = SCNNode()

//4. Get All The Nodes From The SCNFile
let nodeArray = modelScene.rootNode.childNodes

//5. Add Them To The Holder Node
for childNode in nodeArray {
modelHolderNode.addChildNode(childNode as SCNNode)
}

//6. Set The Position
modelHolderNode.position = SCNVector3(0, 0, -1.5)

//7. Add It To The Scene
self.augmentedRealityView?.scene.rootNode.addChildNode(modelHolderNode)


} catch {
print("Error Loading Scene")
}

}

请注意,这是一个非常粗略的示例,不包括检查文件是否存在、缩放等内容,但它应该足以帮助您实现您正在寻找的...

关于ios - 从 SCNScene url 获取下载进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50018196/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com