Как я могу увеличить скорость распаковки файлов с помощью ZIPFoundation? - PullRequest
0 голосов
/ 06 августа 2020

Я загружаю файл .zip, содержащий 3D-модель с текстурами, используя Alamofire. Размер файла в настоящее время составляет 20 МБ. После использования ZIPFoundation время, необходимое для распаковки файла, составляет ~ 50 с. В документации указано, что разархивирование файла размером около 20 МБ должно занимать <1 с. Однако я не добиваюсь таких результатов. Вот мой код, который выполняет запрос на загрузку и распаковку файлов: </p>

func downloadRequest(url: String, method: HTTPMethod, parameters: [String:String]?, headers: [String:String]?, destFileName: String, completion: @escaping (URL?) -> Void) {
    
    //Initial parameters
    let fullDestName = destFileName + ".zip"
    let fm = FileManager.default
    guard let documentsDirectory = fm.urls(for: .documentDirectory, in: .userDomainMask).first else {
        return
    }
    
    //Initialise temporary download location
    let destination: DownloadRequest.DownloadFileDestination = { _,_ in
        let temporaryDownloadDest = documentsDirectory.appendingPathComponent(fullDestName)
        return (temporaryDownloadDest, [.createIntermediateDirectories,.removePreviousFile])
    }
    
    //Call API to begin download request
    Alamofire.download(url, method: method, parameters: parameters, headers: headers, to: destination).response { (response) in
        let responseError = response.error
        if responseError == nil {
            print("File successfully downloaded")
            if let downloadFilePath = response.destinationURL?.path { //.....Documents/name.zip
                let sourceURL = URL(fileURLWithPath: downloadFilePath)
                let destinationURL = documentsDirectory.appendingPathComponent(destFileName) //....Documents/name
                DispatchQueue.global().async { //Failing to do this will lock up main thread
                    do {
                        try fm.createDirectory(at: destinationURL, withIntermediateDirectories: true, attributes: nil)
                        try fm.unzipItem(at: sourceURL, to: destinationURL) // <------ UNZIPPING THE FILE HERE
                        completion(destinationURL)
                    } catch {
                        print("Extraction of ZIP archive failed with error: \(error)")
                        completion(nil)
                    }
                }
            } else {
                print("file path was not found")
                completion(nil)
            }
        } else {
            print("There was an error: \(responseError!)")
            completion(nil)
        }
    }
}

Что-то не так с моим подходом к загрузке и распаковке файлов, или это ограничение библиотеки? Если да, может ли кто-нибудь порекомендовать другую библиотеку, которая ускоряет процесс? Заранее спасибо

1 Ответ

1 голос
/ 06 августа 2020

Код для распаковки архива выглядит неплохо. В Swift существует огромная разница в производительности между оптимизированными и неоптимизированными сборками. Сколько времени занимает распаковка при переключении на сборку "Release"?

...