Как мониторить прогресс нескольких параллельных процессов с использованием NSProgress ?


#1

Добрый вечер коллеги!
Для мониторинга прогресса одного процесса я использую следующий код:

private var progressObservationContext = 0

var progressControl = String()

// код в потоке, в котором выполняется процесс, прогресс которого нужно мониторить 

progressControl = "miRNAInducedSampleProgress"
let options : NSKeyValueObservingOptions = [.new, .old, .initial, .prior]
self.miRNAControlSampleProgress.addObserver(self, forKeyPath: "localizedDescription", options: options, context: &progressObservationContext)
self.miRNAControlSampleProgress.isCancellable = true
self.miRNAControlSampleProgress.totalUnitCount = Int64(myArray.count)
            
for each in myArray
 {
       ...
      self.miRNAControlSampleProgress.completedUnitCount += 1
}
            
self.miRNAControlSampleProgress.removeObserver(self, forKeyPath: "localizedDescription")
            

 //мониторинг 
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{
    guard context == &progressObservationContext else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }
    
    if let theKeyPath = keyPath {
        switch theKeyPath {
            
    case "localizedDescription":
            OperationQueue.main.addOperation {
                let progress = (object as! Progress)
                
                if self.progressControl == "miRNAInducedSampleProgress"
                {
                    self.inducedMiRNAPercentProgressText.stringValue = progress.localizedDescription
                }
            }
        default:
            print("Unknown value")
        }
    } 

Вопрос сдедующий. Есть несколько процессов, которые могут быть запущены одновременно и нужно в параллель выводить для них прогресс, т.е. получать localizedDescription. Как это делается, подскажите пожалуйста!


#2

Поиск привел на сайт Apple,
https://developer.apple.com/library/content/samplecode/UICatalogFortvOS/Listings/UIKitCatalog_ProgressViewController_swift.html

С его помощью переделал код для мониторинга на следующий, для двух процессов и все работает, может кому еще пригодится

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{
    if context == &progressObservationContext,
        keyPath == "localizedDescription",
        let newProgress = object as? Progress,
        newProgress == miRNAInducedSampleProgress
    {
        OperationQueue.main.addOperation {
            
            self.inducedMiRNAPercentProgressText.stringValue = newProgress.localizedDescription
        }
    }
    else if context == &progressObservationContext,
        keyPath == "localizedDescription",
        let newProgress = object as? Progress,
        newProgress == miRNAControlSampleProgress
    {
        OperationQueue.main.addOperation {
            
            self.controlMiRNAPercentProgressText.stringValue = newProgress.localizedDescription
        }
    }
    else
    {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    }

{