假设我正在与Web服务进行异步连接,根据定义,因为它是异步运行在与主线程不同的线程中。
现在假设我将此作业或代码块放在串行调度队列中。由于串行调度队列一次不处理多个作业,但是我发送的作业已经是异步的,那么在调用异步作业之后是否会考虑完成作业?或者它是否会在处理下一个作业之前等待异步作业完成?。
并发队列怎么样,并发生成的线程会生成另一个线程来处理异步操作吗?
编辑:我发现我的问题不是很清楚,所以我的问题是:如果我正在使用相同的串行调度队列,并且我使用dispatch_async调度已经执行异步操作的代码块,例如NSURLConnection - initWithRequest:delegate:运行异步,则该块将被认为是由序列完成的在异步调用之后排队?并且异步调用会生成另一个线程吗?或者在处理第二个作业之前,队列是否仍会等待已完成异步的作业1?
答案 0 :(得分:3)
当您调度到串行队列时,将逐个处理每个已调度的块。因此,如果您的第一个块需要很长时间来处理,那么在长时间运行的第一个块完成之前,将不会调用第二个块。
如果您使用dispatch_async
入队,则只需将新块放到队列的末尾,函数dispatch_async
会立即返回,您可以继续。但是直到前面的块完成后才会执行该块。
但是,dispatch_sync
将一直等到块轮到执行并完成。因此,在您的情况下,dispatch_sync
将阻塞,直到长时间运行的第一个块完成。
如果你调度到并发队列,那么第二个块将在新线程中运行,因此第一个块不会阻止第二个块运行。
您还可以创建两个队列并将它们专用于不同的任务,例如,只有一个队列用于您的Web服务,另一个队列用于不同的任务。这取决于这些操作如何相互关联,哪些操作可以并行运行,哪些必须一个接一个地运行。