NSOperation中操作和阻止之间的区别是什么?

时间:2018-05-29 13:18:34

标签: ios swift multithreading

当我使用以下代码时:

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时,我应该使用哪一个?任何帮助非常感谢!

4 个答案:

答案 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