В чем разница между операцией и блоком в NSOperation? - PullRequest
0 голосов
/ 29 мая 2018

Когда я использую следующие коды:

let queue = OperationQueue()
let operation = BlockOperation()
for i in 0..<10 {
    operation.addExecutionBlock({
        print("===\(Thread.current)===\(i)"
})
}
queue.addOperation(operation)

Я создаю асинхронную очередь для выполнения этих операций.И если я использую коды, подобные следующим:

let queue = OperationQueue()
for i in 0..<10 {
    queue.addOperation(
        print("===\(Thread.current)===\(i)"
)
}

Когда я делаю очередь параллельной, они дают одинаковый результат.Но когда я задаю

queue.maxConcurrentOperationCount = 1

, чтобы сделать очередь последовательной, они отличаются!

Первый из них все еще печатает неупорядоченный результат, как параллельная очередь.Но второй может напечатать упорядоченный результат.

Так в чем разница между ними?Когда я хочу использовать NSOperation, какой я должен использовать?Любая помощь высоко ценится!

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Документы по OperationQueue сообщают вам о параллелизме и порядке выполнения блоков, которые вы отправляете.Вы должны прочитать статью Xcode на OperationQueue.Вот соответствующий бит:

Очередь операций выполняет свои объекты операций в очереди в зависимости от их приоритета и готовности.Если все объекты в очереди имеют одинаковый приоритет и готовы к выполнению, когда они помещены в очередь, то есть их метод isReady возвращает значение true, они выполняются в том порядке, в котором они были отправлены в очередь.Однако никогда не следует полагаться на семантику очереди для обеспечения определенного порядка выполнения объектов операций.Изменения в готовности операции могут изменить результирующий порядок выполнения.Если вам нужно, чтобы операции выполнялись в определенном порядке, используйте зависимости уровня операций, определенные классом Operation.

0 голосов
/ 29 мая 2018

Просто предположение.

В этом случае:

let queue = OperationQueue()
let operation = BlockOperation()
for i in 0..<10 {
    operation.addExecutionBlock({
        print("===\(Thread.current)===\(i)"
})
}
queue.addOperation(operation)

Внутри BlockOperation блоки асинхронны, а сама BlockOperation синхронна.Так что на самом деле это синхронная очередь.

Так что использование queue.addOperation(operation) - нонсенс.Вместо этого я должен использовать operation.start(), потому что это синхронная очередь.

Функция addExecutionBlock () должна использоваться, когда вам нужна синхронная очередь.

Функция addOperation () должнаиспользоваться, когда вам нужна асинхронная очередь.

0 голосов
/ 29 мая 2018

Проверьте, пожалуйста, официальную документацию в отношении addExecutionBlock: функции.Он просто добавляет указанный блок в список блоков получателя для выполнения в контексте выполнения операции.

Если вы хотите сделать это синхронно, вот пример кода:

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
for i in 0..<10 {
    let operation = BlockOperation {
        print("===\(Thread.current)===\(i)")
    }
    queue.addOperation(operation)
}

Когда я хочу использовать NSOperation, какой мне следует использовать?

Воспользуйтесь вторым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...