Ошибка распаковки Операция не может быть завершена.(Ошибка Zip.ZipError 1.) между ViewControllers - PullRequest
0 голосов
/ 01 июня 2018

Я загружаю ZIP-файл с URL-адреса в ViewControllerA и помещаю его в каталог документов, используя:

let documentsUrl:URL =  (FileManager.default.urls(for: .documentDirectory, in: .allDomainsMask).first as URL?)!
let destinationFileUrl = documentsUrl.appendingPathComponent("zipFile.zip")

Когда я пытаюсь извлечь файл из ViewControllerB и распаковать его, используя:

let documentsUrl:URL =  (FileManager.default.urls(for: .documentDirectory, in: .allDomainsMask).first as URL?)!
let destinationFileUrl = documentsUrl.appendingPathComponent("zipFile.zip")
do{
     let file = try Zip.quickUnzipFile(destinationFileUrl)
}catch {
     print("Error: \(error.localizedDescription)")
}

Это дает мне ошибку:

Error: The operation couldn’t be completed. (Zip.ZipError error 1.)

Но когда я пытаюсь сделать это в том же ViewController.т.е. если я пытаюсь загрузить файл в ViewControllerA и сразу же распаковать файл, он работает нормально:

let documentsUrl:URL =  (FileManager.default.urls(for: .documentDirectory, in: .allDomainsMask).first as URL?)!
let destinationFileUrl = documentsUrl.appendingPathComponent("zipFile.zip")

Downloader.load(url: remoteURL, to: destinationFileUrl, completion: {
        print("Downloaded.")
        do{
            let file = try Zip.quickUnzipFile(destinationFileUrl)
        }catch {
            print("Error: \(error.localizedDescription)")
        }                     
})

Вещи, которые я проверил:

  • Zip-файл существует вкаталог документов.
  • Zip-файл имеет допустимый размер файла.
  • Zip-файл имеет разрешения на чтение и запись.

Что мешает распаковать процесс между двумяразные ViewControllers?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Я нашел проблему.Это было не из-за двух разных контроллеров представления, это была ошибка статической функции.Поскольку Downloader.load () был статической функцией, он сохранял файл после загрузки.Вот почему ему не удалось проанализировать Zip-файл, поскольку он не смог открыть его.

Я изменил функцию загрузки класса Downloader на нестатическую:

let downloader: Downloader = Downloader()
downloader.load()

, и она отлично работаетсейчас.К сожалению, ошибка, сгенерированная Zip, не была описательной и не помогла мне разобраться в проблеме.Я создал простое приложение для игровых площадок с двумя контроллерами представления и изучил, почему Zip работает там, а не в моем приложении.Это была единственная разница.

0 голосов
/ 01 июня 2018

Во-первых, операция распаковки не должна помещаться в VC. На самом деле, она не имеет отношения с половиной денег к VC.

Вы можете внести некоторые изменения в код, который вы можете запуститьобычно и сделайте метод общедоступным, а затем вызовите этот метод для получения данных в любом месте.

Downloader.load(url: remoteURL, to: destinationFileUrl, completion: {
        print("Downloaded.")
        do{
            let file = try Zip.quickUnzipFile(destinationFileUrl)
            completion(file)
        }catch {
            print("Error: \(error.localizedDescription)")
        }                     
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...