свойство 'progress' для OperationQueue не работает в iOS 13 - PullRequest
0 голосов
/ 18 марта 2020

iOS 13 ввел свойство progress в классе OperationQueue. В то же время Apple пометила свойства operations и operationCount как устаревшие, что указывает на то, что они больше не должны использоваться для сообщения о прогрессе в очереди.

Моя проблема заключается в том, что я не могу получить свойство progress работать, как я ожидаю, что это сработает (что в основном из коробки). Также я не смог найти никакой документации относительно этого нового свойства (кроме того, что оно теперь существует).

Я пытался заставить его работать в новом проекте SingleView, который имеет один UIProgressView на главном UIViewController , Этот образец в значительной степени вдохновлен https://nshipster.com/ios-13/.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var progressView: UIProgressView!

    private let operationQueue: OperationQueue = {

        let queue = OperationQueue()
        queue.maxConcurrentOperationCount = 1
        queue.underlyingQueue = .global(qos: .background)

        return queue

    }()

    override func viewDidLoad() {

        super.viewDidLoad()

        self.progressView.observedProgress = operationQueue.progress

        self.operationQueue.cancelAllOperations()
        self.operationQueue.isSuspended = true

        for i in 0...9 {

            let operation = BlockOperation {
                sleep(1)
                NSLog("Operation \(i) executed.")
            }

            self.operationQueue.addOperation(operation)

        }

    }

    override func viewDidAppear(_ animated: Bool) {

        self.operationQueue.isSuspended = false

    }

}

Консоль показывает, что очередь работает должным образом (как последовательная очередь), но нет никакого движения в прогрессе bar.

Также KVO для свойства progress напрямую не работает, поэтому я подозреваю, что причиной проблемы является свойство progress OperationQueue, а не UIProgressView.

Есть идеи, что мне здесь не хватает? Или это может быть ошибка в iOS 13? Проблема существует в симуляторе, а также в iPhone 6s Plus, оба работают iOS 13.3.1. Спасибо!

1 Ответ

0 голосов
/ 28 марта 2020

Я только что получил отзыв от Apple об этом. Документация в настоящее время хорошо спрятана в заголовочном файле NSOperation.h. Вот выдержка для любого, кто сталкивается с той же проблемой:

/// @property progress
/// @discussion     The `progress` property represents a total progress of the operations executed in the queue. By default NSOperationQueue
/// does not report progress until the `totalUnitCount` of the progress is set. When the `totalUnitCount` property of the progress is set the
/// queue then opts into participating in progress reporting. When enabled, each operation will contribute 1 unit of completion to the
/// overall progress of the queue for operations that are finished by the end of main (operations that override start and do not invoke super
/// will not contribute to progress). Special attention to race conditions should be made when updating the `totalUnitCount` of the progress
/// as well as care should be taken to avoid 'backwards progress'. For example; when a NSOperationQueue's progress is 5/10, representing 50%
/// completed, and there are 90 more operations about to be added and the `totalUnitCount` that would then make the progress report as 5/100
/// which represents 5%. In this example it would mean that any progress bar would jump from displaying 50% back to 5%, which might not be
/// desirable. In the cases where the `totalUnitCount` needs to be adjusted it is suggested to do this for thread-safety in a barrier by
/// using the `addBarrierBlock:` API. This ensures that no un-expected execution state occurs adjusting into a potentially backwards moving
/// progress scenario.
///
/// @example
/// NSOperationQueue *queue = [[NSOperationQueue alloc] init];
/// queue.progress.totalUnitCount = 10;
...