     @objc private dynamic var progress: Progress?
     @objc private dynamic var message: String = ""
     
-    private var finishObserver: AnyCancellable?
-    private var cancelObserver: AnyCancellable?
-    private var updateTimer: DispatchSourceTimer?
+    private var progressSubscriptions: Set<AnyCancellable> = []
+    private var completionSubscriptions: Set<AnyCancellable> = []
     
     @IBOutlet private weak var indicator: NSProgressIndicator?
     @IBOutlet private weak var descriptionField: NSTextField?

        self.progress?.cancel()
    }
    
    
    
    // MARK: Private Methods
    
    /// Apply the latest progress state to UI.
    private func updateProgress() {
        
        guard
            let progress = self.progress,
            let indicator = self.indicator
            else { return assertionFailure() }
        
        if indicator.doubleValue != progress.fractionCompleted {
            indicator.doubleValue = progress.fractionCompleted
        }
        if self.descriptionField?.stringValue != progress.localizedDescription {
            self.descriptionField?.stringValue = progress.localizedDescription
        }
    }
    
}

    
    
    // MARK: -
    // MARK: View Controller Methods
    
    override func viewWillAppear() {
        
        super.viewWillAppear()
        
        guard
            let progress = self.progress,
            let indicator = self.indicator,
            let descriptionField = self.descriptionField
            else { return assertionFailure() }
        
        self.progressSubscriptions.removeAll()
        
        progress.publisher(for: \.fractionCompleted, options: .initial)
            .throttle(for: 0.2, scheduler: DispatchQueue.main, latest: true)
            .assign(to: \.doubleValue, on: indicator)
            .store(in: &self.progressSubscriptions)
        
        progress.publisher(for: \.localizedDescription, options: .initial)
            .throttle(for: 0.1, scheduler: DispatchQueue.main, latest: true)
            .assign(to: \.stringValue, on: descriptionField)
            .store(in: &self.progressSubscriptions)
    }
    
    
    override func viewDidDisappear() {
        
        super.viewDidDisappear()
        
        self.progressSubscriptions.removeAll()
    }
    
    
