当我使用以下代码时:
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时,我应该使用哪一个?任何帮助非常感谢!
答案 0 :(得分:0)
请查看官方documentation认为的addExecutionBlock:
功能。它只是将指定的块添加到接收器的块列表中,以便在执行操作的上下文中执行。
如果您想同步执行此操作,请参阅以下代码示例:
let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1
for i in 0..<10 {
let operation = BlockOperation {
print("===\(Thread.current)===\(i)")
}
queue.addOperation(operation)
}
当我想使用NSOperation时,我应该使用哪一个?
使用第二个。
答案 1 :(得分:0)
OperationQueue上的文档告诉您提交的块的并发性和执行顺序。您应该阅读有关OperationQueue的Xcode文章。这是一个相关的部分:
操作队列基于执行其排队的操作对象 他们的优先事项和准备就绪如果所有排队的操作对象 具有相同的优先级,并准备好在它们被放入时执行 队列 - 也就是说,他们的isReady方法返回true - 它们被执行 按照它们提交到队列的顺序。但是,你 永远不要依赖队列语义来确保特定的执行 操作对象的顺序。操作就绪的变化 可以更改生成的执行顺序。如果你需要操作 按特定顺序执行,使用操作级依赖项 由Operation类定义。
答案 2 :(得分:0)
只是一个猜测。
在这种情况下:
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()。
答案 3 :(得分:0)
差异-> BlockOperation具有addDependency
,而OperationQueue()需要addOperations
。以下带有控制台输出的代码将详细说明:
let opQueue = OperationQueue()
opQueue.addOperation {
print("operation 1")
}
let operation2 = BlockOperation {
print("operation 2")
}
let operation3 = BlockOperation {
print("operation 3")
}
operation2.addDependency(operation3)
opQueue.addOperation(operation2)
opQueue.addOperation(operation3)
控制台输出:
operation 1
operation 3
operation 2