3 回答
TA贡献1982条经验 获得超2个赞
通常将块分配到主队列是从后台队列完成的,以表示某些后台处理已完成,例如
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
在这种情况下,我们将在后台队列上进行冗长的计算,并且需要在计算完成后更新UI。通常必须从主队列中完成UI的更新,因此我们使用第二个嵌套的dispatch_async将其“信号”回到主队列。
可能还有其他一些示例,您可能希望将其分派回主队列,但是通常以这种方式完成,即从分派到后台队列的块中嵌套。
后台处理完成->更新UI
在后台队列上处理的数据块->信号主队列以开始下一个块
后台队列上的传入网络数据->通知主队列消息已到达
等
至于为什么您可能希望从主队列中分派到主队列中呢……好吧,尽管可以想象,您可能不会这样做以安排一些工作在下次运行循环中进行。
TA贡献1852条经验 获得超7个赞
从主线程调度块到主队列可以是有用的。它使主队列有机会处理已排队的其他块,这样您就不会简单地阻止其他所有对象的执行。
例如,您可以编写一个本质上是单线程的服务器,该服务器仍然可以处理许多并发连接。只要队列中没有任何单个块花费太长时间,服务器就会保持对新请求的响应。
如果您的程序只花一生时间来响应事件,那么什么都不做,那么这很自然。您只需将事件处理程序设置为在主队列上运行,然后调用dispatch_main(),就根本不必担心线程安全。
TA贡献1993条经验 获得超5个赞
希望我能正确理解您的问题,因为您想知道dispatch_async和dispatch_sync之间的区别?
dispatch_async
将异步地将块分配到队列。这意味着它将继续将块发送到队列,而无需等待其返回,然后继续执行方法中剩余的代码。
dispatch_sync
将同步将块分配到队列。这将防止在该块执行完之前再执行该方法中剩余的代码。
我大部分dispatch_async时间都在后台队列中使用a 来摆脱主队列的工作,并利用设备可能具有的任何额外核心。然后dispatch_async,如果需要更新UI,请转到主线程。
- 3 回答
- 0 关注
- 469 浏览
添加回答
举报