gpt4 book ai didi

ios - 在 downloadTask 完成后执行 segue

转载 作者:可可西里 更新时间:2023-11-01 02:05:46 25 4
gpt4 key购买 nike

我正在构建一个应用程序,一旦它连接到特定的本地网络,它就会显示一个事件指示器,然后开始下载图像的 zip 文件,一旦图像下载完毕,它就会解压缩文件,停止指示器,然后执行 segue 以下一个 View Controller 。我拥有所有功能,但不知道如何查看功能何时完成。我的 Donloader 类如下所示:

class Downloader {

let documentsUrl: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!

required init() {

self.load()
}

func load() {

// Create destination URL
let destinationFileUrl = documentsUrl.appendingPathComponent("Images.zip")

//Create URL to the source file you want to download
let fileURL = URL(string: "http://127.0.0.1:4567/download")//FIXME for production

//Create Session
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
let request = URLRequest(url:fileURL!)

let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in

if let tempLocalUrl = tempLocalUrl, error == nil {
// Success
if let statusCode = (response as? HTTPURLResponse)?.statusCode {
print("Successfully downloaded. Status code: \(statusCode)")
}

do {

try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
} catch (let writeError) {

print("Error creating a file \(destinationFileUrl) : \(writeError)")
}

} else {

print("Error took place while downloading a file. Error description: %@", (error?.localizedDescription)! as String);
}
}
task.resume()
}
}

我的 File 类中的解压缩函数如下所示:

func unZip() {


let zipFileURL = documentsURL?.appendingPathComponent("Images.zip")

SSZipArchive.unzipFile(atPath: (zipFileURL?.path)!, toDestination: (documentsURL?.path)!)

var directoryContents = [URL]()

do {
// Get the directory contents urls (including subfolders urls)
directoryContents = try fileManager.contentsOfDirectory(at: documentsURL!, includingPropertiesForKeys: nil, options: [])
} catch let error as NSError {

print(error.localizedDescription)
}

let pngFiles = directoryContents.filter{ $0.pathExtension == "png" }//FIXME change file types if needed

imageNamesArray = pngFiles.map{ $0.deletingPathExtension().lastPathComponent }
}

我看过闭包,但不明白如何从类外部或另一个 ViewController 调用它们。任何帮助都会非常感谢。

最佳答案

添加一个没有返回值的完成处理程序非常简单。将 load 方法更改为

func load(finished: @escaping ()->()) 

任务结束时调用finished()

  let task = session.downloadTask(with: request) { ...

finished()
}

并以这种方式调用load()

load() {
// task has finished
}

但是对于完成处理程序,您应该删除 required init 并分别调用 initload

关于ios - 在 downloadTask 完成后执行 segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43006848/

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