Home > database >  How to print progress with ZIPFoundation
How to print progress with ZIPFoundation

Time:12-24

How can I track and print progress percentage to console on each progress update using ZIPFoundation in a class file that is not a controller?

I am quite new to swift and I have been trying to understand how Progress works for quite a long time because it seems like it can be used to track the progress of unzip process using ZIPFoundation module (unfortunately without a luck so far). For the info, the unzipping itself works fine for me.

As far as I know it should be something similar to this, but I am not sure how to track it:

class MyClass {
    @objc var unzipProgress: Progress?

func unzipFile(from: URL, to: URL) -> Bool {
        let fileManager = FileManager()
        
        print("Unzipping...")
        do {            
            // How to track unzipProgress?
            try fileManager.unzipItem(at: from, to: to, progress: unzipProgress)
            print("Extraction success from \(from.path) to \(to.path)")
        } catch {
            print("Extraction of ZIP archive failed with error:\(error)")
        }
    }

Edit: I am familiar with this post but it does not help me as it uses JGProgressHUD and a controller class.

CodePudding user response:

The documentation for ZIPFoundation tells you how to monitor progress.

You need to create a Progress object:

let unzipProgress = Progress()

Then you need to setup an observer for the fractionCompleted property:

let observation = unzipProgress.observe(\.fractionCompleted) { progress, _ in
  print("progress: ", progress.fractionCompleted)
}

Then pass in your unzipProgress to one of the zip methods:

try fileManager.unzipItem(at: from, to: to, progress: unzipProgress)

Then you can cleanup the observation:

observation.invalidate()

Your unzipFile function becomes something like this:

func unzipFile(from: URL, to: URL) -> Bool {
    let fileManager = FileManager()

    let unzipProgress = Progress()
    let observation = unzipProgress.observe(\.fractionCompleted) { progress, _ in
       print("Extraction progress: ", progress.fractionCompleted)
    }
    
    print("Unzipping...")
    do {            
        // How to track unzipProgress?
        try fileManager.unzipItem(at: from, to: to, progress: unzipProgress)
        print("Extraction success from \(from.path) to \(to.path)")
    } catch {
        print("Extraction of ZIP archive failed with error:\(error)")
    }

    observation.invalidate()
}

You can remove your unzipProgress property from your class since you only need the local variable.

  • Related