Ios 单独线程中的同步与异步相同吗
最近,我在swift学习并发。根据苹果公司在《操作类参考》中的文件: 将操作添加到操作队列时,队列将忽略asynchronous属性的值,并始终从单独的线程调用start方法。因此,如果总是通过将操作添加到操作队列来运行操作,则没有理由使其异步 这是否意味着单独线程中的同步与异步相同?当我使用下面的代码进行测试时,该操作确实不会阻塞当前的主线程Ios 单独线程中的同步与异步相同吗,ios,asynchronous,nsoperation,synchronous,Ios,Asynchronous,Nsoperation,Synchronous,最近,我在swift学习并发。根据苹果公司在《操作类参考》中的文件: 将操作添加到操作队列时,队列将忽略asynchronous属性的值,并始终从单独的线程调用start方法。因此,如果总是通过将操作添加到操作队列来运行操作,则没有理由使其异步 这是否意味着单独线程中的同步与异步相同?当我使用下面的代码进行测试时,该操作确实不会阻塞当前的主线程 let operationQueue = NSOperationQueue() let operation = NSBlockOperation(){
let operationQueue = NSOperationQueue()
let operation = NSBlockOperation(){
//do some task here
}
operationQueue.addOperation(operation)
因此,如果这是真的,那么我们为什么要创建NSOperation的并发子类呢?异步总是相对于发出请求的线程定义的。因此,如果线程a发出在线程B中运行的请求,使得线程a能够在线程B运行请求时执行其他工作,那么请求相对于线程a是异步的 如果线程B将请求转发给线程C,这样线程B可以在线程C运行请求时执行其他工作,那么第二个请求相对于线程B是异步的
当然,一次又一次地异步耕作同一个工作元素是没有意义的。但是假设上面描述的由线程A委托给线程B的工作可以被分成多个较小的工作元素。线程B在线程C、D等上异步调用较小的工作元素是合理的。如果B向a提供服务,而a不想/不需要知道如何完成工作的细节,则可能会发生这种情况;它只是希望异步完成工作。B知道细节,可以决定是否/如何通过较小的并行单元完成工作。哦,
NSOperation
。你的历史太离奇了
NSOperation
相对较旧(用iOS术语;用ObjC术语来说相当现代)。它是在OSX10.5中添加的。在OSX10.6/IOS4之前,没有NSBlockOperation
对象。根本没有街区。因此,进行操作的唯一方法是子类化或使用NSInvocationOperation
。这两种方法都很麻烦,但仍然比直接使用NSThread
的旧方法更简单、更强大
(这在多核成为一种事物的时候是正确的。10.5以添加核心动画而闻名,我相信这是Cocoa中第一个主要的抢先多任务框架。在10.5之前,大多数事情都是通过runloop和协作多任务来完成的,这对于单核系统来说实际上是非常高效和有效的。但它不是t可以很好地扩展到多核系统。提供了NSOperation
等工具来帮助我们编写更好的多核代码,但GCD功能强大得多,它完全控制了用Cocoa编写多任务代码的方式。)
当您将NSOperation
子类化时,您需要告诉系统您的操作是否是异步的。这不是异步运行您的请求。这是您的start
方法不会阻塞的承诺。由您的start
方法来确保操作确实是异步的
只有在手动启动NSOperation
的情况下,才需要这样做,即使在手动启动的情况下,通常也不需要这样做。如果您将其放入NSOperationQueue
(您确实应该始终这样做),则此属性与此无关。我记得当时它造成了很多混乱
自从引入块以来,它变得更加无关紧要。使用NSBlockOperation
(或dispatch\u async
)几乎总是比使用子类NSOperation
容易得多,而子类NSOperation
总是有点棘手
以防万一,您还没有读过它,如果您想研究Cocoa并发,您一定要从开始。真的谢谢。如果我理解正确,您的意思是在单独的线程中同步确实与异步相同。实际上,在使用
NSOperationQueue时,不需要更改异步属性代码>。两个计数都正确。