Osc*_*mez 4 concurrency asynchronous grand-central-dispatch
假设我正在与 Web 服务建立异步连接,根据定义,它是异步的,它在与主线程不同的线程中运行。
现在假设我把这个工作或代码块放在一个串行调度队列中。由于串行调度队列一次不处理超过 1 个作业,但我发送的作业已经是异步的,那么它会认为在调用异步作业后完成该作业吗?或者它会在处理下一个作业之前等待异步作业完成吗?
并发队列怎么样,并发生成的线程会生成另一个线程来处理异步操作吗?
编辑:我意识到我的问题不是很清楚,所以我的问题是:
如果我使用相同的串行调度队列,并且我使用 dispatch_async 调度已经执行异步操作的代码块,例如 NSURLConnection – initWithRequest:delegate: 运行异步,该块在异步调用?,该异步调用会生成另一个线程吗?。或者队列是否会在处理第二个作业之前等待已经异步的作业 1 完成?
当您分派到串行队列时,每个分派的块都被一个接一个地处理。因此,如果您的第一个块需要很长时间来处理,那么在长时间运行的第一个块完成之前不会调用第二个块。
如果您正在排队,dispatch_async
新块只是简单地放在队列的末尾,函数会dispatch_async
立即返回,您可以继续。但是在前面的块完成之前不会执行该块。
但是,dispatch_sync
将等到该块轮到它执行并完成。因此,在您的情况下,dispatch_sync
将阻塞,直到长时间运行的第一个块完成。
如果您分派到并发队列,那么第二个块将在新线程中运行,因此第一个块不会阻止第二个块运行。
您还可以创建两个队列并将它们专用于不同的任务,例如,一个队列仅用于您的 Web 服务内容,另一个队列用于不同的任务。这取决于这些操作如何相互关联,哪些可以并行运行,哪些必须一个接一个运行。
归档时间: |
|
查看次数: |
1411 次 |
最近记录: |