在 OperationQueue 中打印 1 到 10 不要打印整数
print 1 to 10 in OperationQueue don't print whole number
我正在研究 Combine Scheduler,我有 Raywenderlich 书中的示例代码
let queue = OperationQueue()
let subscription = (1...10).publisher
.receive(on: queue)
.sink { value in
print("Received \(value) on thread \(Thread.current.number)")
}
这本书解释说 OperationQueue 使用所有可用的线程,因此打印顺序和线程可以是随机的。我理解那部分,但是当我在操场上 运行 这段代码时,我只看到 10 个中的 5 个数字。
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 个数字?
您需要导入 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
我正在研究 Combine Scheduler,我有 Raywenderlich 书中的示例代码
let queue = OperationQueue()
let subscription = (1...10).publisher
.receive(on: queue)
.sink { value in
print("Received \(value) on thread \(Thread.current.number)")
}
这本书解释说 OperationQueue 使用所有可用的线程,因此打印顺序和线程可以是随机的。我理解那部分,但是当我在操场上 运行 这段代码时,我只看到 10 个中的 5 个数字。
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 个数字?
您需要导入 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