From 8f11e2d8353f162ecce6a7a031f82118f6a9bf7e Mon Sep 17 00:00:00 2001 From: Szymon Mrozek Date: Mon, 21 May 2018 10:11:13 +0200 Subject: [PATCH] Fix crash --- Cedric/Cedric.swift | 42 +++++++++++++++++++--------------- Cedric/MulticastDelegate.swift | 2 +- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/Cedric/Cedric.swift b/Cedric/Cedric.swift index 0678572..04902fd 100644 --- a/Cedric/Cedric.swift +++ b/Cedric/Cedric.swift @@ -180,24 +180,39 @@ public class Cedric { group.addAsyncOperation(operation: operation) - delegates.invoke({ [task = item.task!] in - $0.cedric(self, didStartDownloadingResource: item.resource, withTask: task) + delegates.invoke({ [task = item.task!, resource = item.resource] in + $0.cedric(self, didStartDownloadingResource: resource, withTask: task) }) } + + fileprivate func remove(downloadItem item: DownloadItem) { + guard let index = items.index(of: item) else { return } + let item = items[index] + + items.remove(at: index) + item.releaseReferences() + + guard items.isEmpty else { return } + delegates.invoke({ $0.cedric(self, didFinishWithMostRecentError: self.lastError) }) + } } // MARK: - DownloadItemDelegate extension Cedric: DownloadItemDelegate { internal func item(_ item: DownloadItem, withTask task: URLSessionDownloadTask, didCompleteWithError error: Error?) { - delegates.invoke({ $0.cedric(self, didCompleteWithError: error, withTask: task, whenDownloadingResource: item.resource) }) + delegates.invoke({ [resource = item.resource, task] in + $0.cedric(self, didCompleteWithError: error, withTask: task, whenDownloadingResource: resource) + }) item.delegate = nil remove(downloadItem: item) } internal func item(_ item: DownloadItem, didUpdateStatusOfTask task: URLSessionDownloadTask) { // single item progress report - delegates.invoke({ $0.cedric(self, didUpdateStatusOfTask: task, relatedToResource: item.resource) }) + delegates.invoke({ [task, resource = item.resource] in + $0.cedric(self, didUpdateStatusOfTask: task, relatedToResource: resource) + }) // maybe should consider some groupped resources progress reporting ... } @@ -205,25 +220,16 @@ extension Cedric: DownloadItemDelegate { internal func item(_ item: DownloadItem, didFinishDownloadingTo location: URL) { do { let file = try DownloadedFile(absolutePath: location) - delegates.invoke({ $0.cedric(self, didFinishDownloadingResource: item.resource, toFile: file) }) + delegates.invoke({ [resource = item.resource] in + $0.cedric(self, didFinishDownloadingResource: resource, toFile: file) + }) } catch let error { - delegates.invoke({ [task = item.task!] in - $0.cedric(self, didCompleteWithError: error, withTask: task, whenDownloadingResource: item.resource) + delegates.invoke({ [task = item.task!, resource = item.resource] in + $0.cedric(self, didCompleteWithError: error, withTask: task, whenDownloadingResource: resource) }) } item.delegate = nil remove(downloadItem: item) } - - fileprivate func remove(downloadItem item: DownloadItem) { - guard let index = items.index(of: item) else { return } - let item = items[index] - - items.remove(at: index) - item.releaseReferences() - - guard items.isEmpty else { return } - delegates.invoke({ $0.cedric(self, didFinishWithMostRecentError: self.lastError) }) - } } diff --git a/Cedric/MulticastDelegate.swift b/Cedric/MulticastDelegate.swift index 30fec6f..a6d73dd 100644 --- a/Cedric/MulticastDelegate.swift +++ b/Cedric/MulticastDelegate.swift @@ -23,7 +23,7 @@ internal class MulticastDelegate { } internal func addDelegate(_ delegate: T) { - queue.async { [weak self] in + queue.async { [weak self] in self?.delegates.add(delegate as AnyObject) } }