为了账号安全,请及时绑定邮箱和手机立即绑定

iPhone-大中央调度主线程

iPhone-大中央调度主线程

iOS
慕盖茨4494581 2019-11-22 14:37:20
我一直在应用程序中成功使用大型中央调度程序,但是我想知道使用这样的东西的真正优势是什么:dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff甚至dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff我的意思是,在两种情况下,您都将触发要在主线程上执行的块,确切地说是应用程序的运行位置,这无助于减少负载。在第一种情况下,您无法控制该块何时运行。我已经看到了在您触发它们后半秒钟执行块的情况。第二种情况,类似于[self doStuff];对?我想知道你们的想法。
查看完整描述

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

在后台队列上处理的数据块->信号主队列以开始下一个块

后台队列上的传入网络数据->通知主队列消息已到达

至于为什么您可能希望从主队列中分派到主队列中呢……好吧,尽管可以想象,您可能不会这样做以安排一些工作在下次运行循环中进行。


查看完整回答
反对 回复 2019-11-22
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

从主线程调度块到主队列可以是有用的。它使主队列有机会处理已排队的其他块,这样您就不会简单地阻止其他所有对象的执行。

例如,您可以编写一个本质上是单线程的服务器,该服务器仍然可以处理许多并发连接。只要队列中没有任何单个块花费太长时间,服务器就会保持对新请求的响应。

如果您的程序只花一生时间来响应事件,那么什么都不做,那么这很自然。您只需将事件处理程序设置为在主队列上运行,然后调用dispatch_main(),就根本不必担心线程安全。


查看完整回答
反对 回复 2019-11-22
?
ibeautiful

TA贡献1993条经验 获得超5个赞

希望我能正确理解您的问题,因为您想知道dispatch_async和dispatch_sync之间的区别?


dispatch_async

将异步地将块分配到队列。这意味着它将继续将块发送到队列,而无需等待其返回,然后继续执行方法中剩余的代码。


dispatch_sync

将同步将块分配到队列。这将防止在该块执行完之前再执行该方法中剩余的代码。


我大部分dispatch_async时间都在后台队列中使用a 来摆脱主队列的工作,并利用设备可能具有的任何额外核心。然后dispatch_async,如果需要更新UI,请转到主线程。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 469 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信