猿问

iPhone-大中央调度主线程

我一直在应用程序中成功使用大型中央调度程序,但是我想知道使用这样的东西的真正优势是什么:


dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff

甚至


dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff

我的意思是,在两种情况下,您都将触发要在主线程上执行的块,确切地说是应用程序的运行位置,这无助于减少负载。在第一种情况下,您无法控制该块何时运行。我已经看到了在您触发它们后半秒钟执行块的情况。第二种情况,类似于


[self doStuff];

对?


我想知道你们的想法。


慕盖茨4494581
浏览 470回答 3
3回答

临摹微笑

通常将块分配到主队列是从后台队列完成的,以表示某些后台处理已完成,例如- (void)doCalculation{&nbsp; &nbsp; //you can use any string instead "com.mycompany.myqueue"&nbsp; &nbsp; dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);&nbsp; &nbsp; dispatch_async(backgroundQueue, ^{&nbsp; &nbsp; &nbsp; &nbsp; int result = <some really long calculation that takes seconds to complete>;&nbsp; &nbsp; &nbsp; &nbsp; dispatch_async(dispatch_get_main_queue(), ^{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [self updateMyUIWithResult:result];&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; });}在这种情况下,我们将在后台队列上进行冗长的计算,并且需要在计算完成后更新UI。通常必须从主队列中完成UI的更新,因此我们使用第二个嵌套的dispatch_async将其“信号”回到主队列。可能还有其他一些示例,您可能希望将其分派回主队列,但是通常以这种方式完成,即从分派到后台队列的块中嵌套。后台处理完成->更新UI在后台队列上处理的数据块->信号主队列以开始下一个块后台队列上的传入网络数据->通知主队列消息已到达等至于为什么您可能希望从主队列中分派到主队列中呢……好吧,尽管可以想象,您可能不会这样做以安排一些工作在下次运行循环中进行。

慕姐4208626

从主线程调度块到主队列可以是有用的。它使主队列有机会处理已排队的其他块,这样您就不会简单地阻止其他所有对象的执行。例如,您可以编写一个本质上是单线程的服务器,该服务器仍然可以处理许多并发连接。只要队列中没有任何单个块花费太长时间,服务器就会保持对新请求的响应。如果您的程序只花一生时间来响应事件,那么什么都不做,那么这很自然。您只需将事件处理程序设置为在主队列上运行,然后调用dispatch_main(),就根本不必担心线程安全。

ibeautiful

希望我能正确理解您的问题,因为您想知道dispatch_async和dispatch_sync之间的区别?dispatch_async将异步地将块分配到队列。这意味着它将继续将块发送到队列,而无需等待其返回,然后继续执行方法中剩余的代码。dispatch_sync将同步将块分配到队列。这将防止在该块执行完之前再执行该方法中剩余的代码。我大部分dispatch_async时间都在后台队列中使用a 来摆脱主队列的工作,并利用设备可能具有的任何额外核心。然后dispatch_async,如果需要更新UI,请转到主线程。
随时随地看视频慕课网APP

相关分类

iOS
我要回答