Why is the result of the code same? The code is using only the value of the last function for all the looping

Home / Uncategorized / Why is the result of the code same? The code is using only the value of the last function for all the looping

Question:
All value in variable (filename, destinationFolder) is different for all loop except the "let uploadDidFinish: (()-> Void)". From what I learnt, it is supposed to be different as it is declared in a different instance.

I put the following code in view controller viewdidload()
let uploadDidFinish: ()-> Void = {
print("nunzip (self.foldername+".zip")n")
self.c.unzipFile(foldername: self.mfoldername+"/"+self.foldername,filename: self.foldername+".zip")
}
DownloadManager.shared.downloadFile("https://ping.passivealtitude.com/magazinefile/"+foldername+"/"+foldername+".zip", to: mfoldername+"/"+foldername, filename: foldername+".zip", upload: uploadDidFinish)

After I loop 4 times, the result of code above is

downloaded to file:///Users/vivian/Library/Developer/CoreSimulator/Devices/3FF96128-FC8F-4D44-9B4D-DC1989EFF9FF/data/Containers/Data/Application/15B32C21-6117-4CD9-A70E-7C0BFC0DFA6A/Documents/Magazine/book1/book1.zip

downloaded to file:///Users/vivian/Library/Developer/CoreSimulator/Devices/3FF96128-FC8F-4D44-9B4D-DC1989EFF9FF/data/Containers/Data/Application/15B32C21-6117-4CD9-A70E-7C0BFC0DFA6A/Documents/Magazine/book2/book2.zip

downloaded to file:///Users/vivian/Library/Developer/CoreSimulator/Devices/3FF96128-FC8F-4D44-9B4D-DC1989EFF9FF/data/Containers/Data/Application/15B32C21-6117-4CD9-A70E-7C0BFC0DFA6A/Documents/Magazine/book3/book3.zip

downloaded to file:///Users/vivian/Library/Developer/CoreSimulator/Devices/3FF96128-FC8F-4D44-9B4D-DC1989EFF9FF/data/Containers/Data/Application/15B32C21-6117-4CD9-A70E-7C0BFC0DFA6A/Documents/Magazine/book4/book4.zip

unzip book4.zip

unzip book4.zip

unzip book4.zip

unzip book4.zip

when it supposed to be

unzip book1.zip

unzip book2.zip

unzip book3.zip

unzip book4.zip

First the function is passed to
class DownloadManager: NSObject {

@discardableResult
func downloadFile(_ url: String, to foldername: String, filename:String, upload: @escaping (()->Void)) -> DownloadOperation {
let link = URL(string: url)
let destinationFolder = createDirectory(foldername: foldername)
let operation = DownloadOperation(session: session, url: link!, destinationFolder: destinationFolder, filename:filename, upload: upload)
operations[operation.task.taskIdentifier] = operation
queue.addOperation(operation)
return operation
}

Then, I have passed the download file function to
class DownloadOperation : AsynchronousOperation {
var task: URLSessionTask!
let destinationFolder: URL
let filename: String
let uploadDidFinish: (()-> Void)
let manager = FileManager.default

init(session: URLSession, url: URL, destinationFolder: URL,filename: String, upload: @escaping (()->Void)) {
self.filename = filename
self.destinationFolder = destinationFolder
self.uploadDidFinish = upload
super.init()
task = session.downloadTask(with: url)
}

override func cancel() {
task.cancel()
super.cancel()
}

override func main() {
task.resume()
}
}

extension DownloadOperation: URLSessionDownloadDelegate {

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
do {
let destinationURL = destinationFolder.appendingPathComponent(filename)
if manager.fileExists(atPath: destinationURL.path) {
try manager.removeItem(at: destinationURL)
}
try manager.moveItem(at: location, to: destinationURL)
print(" ndownloaded to (destinationURL)n")
} catch {
print("DownloadOperation: URLSessionDownloadDelegate: (error)")
}

self.uploadDidFinish()

}

The code below connects view controller to my download manager.
DispatchQueue.main.async {
self.uploadDidFinish()
}

The original code is from How To Download Multiple Files Sequentially using NSURLSession downloadTask in Swift

Why is the result same? Any help is much appreciated!


Answer:
When uploadDidFinish been execute self.foldername already changed to book4, so print("nunzip (self.foldername+".zip")n") always output: unzip book4.zip. e.g.
class DownloadOperation : AsynchronousOperation {

let uploadDidFinish: ((String, String)-> Void)
init(session: URLSession, url: URL, destinationFolder: URL,filename: String, upload: @escaping ((String, String)->Void)) {

self.uploadDidFinish = upload
}
}

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

self.uploadDidFinish(filename, destinationFolder.path)
}
}
Read more

Leave a Reply

Your email address will not be published. Required fields are marked *