diff --git a/AltStore/Apps/AppManager.swift b/AltStore/Apps/AppManager.swift index 75c39ea5..38c999c4 100644 --- a/AltStore/Apps/AppManager.swift +++ b/AltStore/Apps/AppManager.swift @@ -26,7 +26,8 @@ class AppManager private let operationQueue = OperationQueue() private let processingQueue = DispatchQueue(label: "com.altstore.AppManager.processingQueue") - private var installationProgress = [App: Progress]() + private var installationProgress = [String: Progress]() + private var refreshProgress = [String: Progress]() private init() { @@ -112,11 +113,13 @@ extension AppManager return progress } + let appIdentifier = app.identifier + let group = self.install([app], forceDownload: true, presentingViewController: presentingViewController) group.completionHandler = { (result) in do { - self.installationProgress[app] = nil + self.installationProgress[appIdentifier] = nil guard let (_, result) = try result.get().first else { throw OperationError.unknown } completionHandler(result) @@ -127,22 +130,35 @@ extension AppManager } } - self.installationProgress[app] = group.progress + self.installationProgress[app.identifier] = group.progress return group.progress } func refresh(_ installedApps: [InstalledApp], presentingViewController: UIViewController?, group: OperationGroup? = nil) -> OperationGroup { - let apps = installedApps.compactMap { $0.app } + let apps = installedApps.compactMap { $0.app }.filter { self.refreshProgress(for: $0) == nil } let group = self.install(apps, forceDownload: false, presentingViewController: presentingViewController, group: group) + + for app in apps + { + guard let progress = group.progress(for: app) else { continue } + self.refreshProgress[app.identifier] = progress + } + return group } func installationProgress(for app: App) -> Progress? { - let progress = self.installationProgress[app] + let progress = self.installationProgress[app.identifier] + return progress + } + + func refreshProgress(for app: App) -> Progress? + { + let progress = self.refreshProgress[app.identifier] return progress } } @@ -250,9 +266,8 @@ private extension AppManager progress.addChild(installOperation.progress, withPendingUnitCount: 30) installOperation.addDependency(sendAppOperation) operations.append(installOperation) - - group.progress.totalUnitCount += 1 - group.progress.addChild(progress, withPendingUnitCount: 1) + + group.set(progress, for: app) } group.addOperations(operations) @@ -302,6 +317,8 @@ private extension AppManager } } + self.refreshProgress[context.appIdentifier] = nil + print("Finished operation!", context.appIdentifier) if context.group.results.count == context.group.progress.totalUnitCount diff --git a/AltStore/Operations/OperationGroup.swift b/AltStore/Operations/OperationGroup.swift index 6a081e14..5f3f04aa 100644 --- a/AltStore/Operations/OperationGroup.swift +++ b/AltStore/Operations/OperationGroup.swift @@ -25,6 +25,8 @@ class OperationGroup var results = [String: Result]() + private var progressByApp = [App: Progress]() + private let operationQueue = OperationQueue() private let installOperationQueue = OperationQueue() @@ -60,4 +62,18 @@ class OperationGroup } } } + + func set(_ progress: Progress, for app: App) + { + self.progressByApp[app] = progress + + self.progress.totalUnitCount += 1 + self.progress.addChild(progress, withPendingUnitCount: 1) + } + + func progress(for app: App) -> Progress? + { + let progress = self.progressByApp[app] + return progress + } }