печать от 1 до 10 в OperationQueue не выводит целое число

#swift #multithreading #combine #operationqueue

#swift #многопоточность #объединить #operationqueue

Вопрос:

Я изучаю планировщик объединения, и у меня есть этот пример кода из книги Raywenderlich

 let queue = OperationQueue()

let subscription = (1...10).publisher
  .receive(on: queue)
  .sink { value in
    print("Received (value) on thread (Thread.current.number)")
  }

  

В книге объясняется, что OperationQueue использует все доступные потоки, поэтому порядок печати и поток могут быть случайными. Я понимаю эту часть, но когда я запускаю этот код на своей игровой площадке, я вижу только 5 чисел из 10.

 Received 1 on thread 7
Received 2 on thread 6
Received 3 on thread 5
Received 7 on thread 9
Received 6 on thread 4
  

Почему этот код не отображает все 10 чисел??

Ответ №1:

Вам нужно импортировать PlaygroundSupport и установить PlaygroundPage.current.needsIndefiniteExecution = true в верхней части файла.

Если вы используете другой метод приемника, тот, для которого вы также получаете блок обработчика завершения, тогда в этом обработчике завершения вы должны вызвать PlaygroundPage.current.finishExecution()

Редактировать: вызовите PlaygroundPage.current.finishExecution() блок барьера в очереди, в противном случае он будет вызван до того, как все ваши операторы печати будут выполнены.

Вот мой тестовый код:

 PlaygroundPage.current.needsIndefiniteExecution = true

let queue = OperationQueue()

let subscription = (1...10).publisher
    .receive(on: queue)
    .sink(receiveCompletion: { _ in
        queue.addBarrierBlock {
            print("Finished")
            PlaygroundPage.current.finishExecution()
        }
    }, receiveValue: { value in
        print("Received (value) on thread (Thread.current)")
    })
  

И вывод:

 Received 1 on thread <NSThread: 0x7fd86f204080>{number = 2, name = (null)}
Received 2 on thread <NSThread: 0x7fd86f404340>{number = 3, name = (null)}
Received 3 on thread <NSThread: 0x7fd86f404430>{number = 4, name = (null)}
Received 7 on thread <NSThread: 0x7fd86f405240>{number = 5, name = (null)}
Received 6 on thread <NSThread: 0x7fd86f205c50>{number = 6, name = (null)}
Received 10 on thread <NSThread: 0x7fd86ce487f0>{number = 7, name = (null)}
Received 5 on thread <NSThread: 0x7fd86cf048a0>{number = 10, name = (null)}
Received 9 on thread <NSThread: 0x7fd86ce49b20>{number = 11, name = (null)}
Received 4 on thread <NSThread: 0x7fd86cf2a4c0>{number = 12, name = (null)}
Received 8 on thread <NSThread: 0x7fd86ce4ad60>{number = 13, name = (null)}
Finished
  

Комментарии:

1. Я протестировал после изменения этого значения на true, но он выдает тот же результат.