当我已经在主线程中时调度到主队列

时间:2013-12-07 06:50:44

标签: ios objective-c user-interface grand-central-dispatch

告诉我这是否有意义。这是一个iOS问题。

我看到它已经在主线程中的代码,但代码会将各种UI代码dispatch_async分配给主线程的队列。布局,动画等等。

我被告知了一些如何提高响应速度(例如,在推送视图控制器时,您会在那里调度其他UI操作,因此它不会阻止推送过渡。

这没有意义,因为首先它是危险的,其次,它不保证UI代码何时运行(即使它可能会以毫秒运行)。我能看到的唯一好处是保证UI代码不会意外地在不同的线程中运行。

你们有什么想法?

1 个答案:

答案 0 :(得分:5)

你肯定会使用这种调度回主队列的模式,所以我可能不会太快解除它或将其标记为“危险”(虽然你表征它的方式,但听起来很可疑)。您应该分享一些代码示例,了解您如何看待使用此模式,我们可以进一步发表评论。

你什么时候派遣到主队列?原型示例是当您在后台队列上执行某些操作时,但是然后想要将UI更新分发回主队列,例如:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

     // do something time consuming here, like network request or the like

     // when done, update the UI on the main queue:

     dispatch_async(dispatch_get_main_queue(), ^{

         // update the UI here

     });
});

但是我假设这不是你正在谈论的主要队列的派遣。我假设从你的评论中你在主队列上有东西异步调度回到主队列本身。

您这样做的原因是您不希望调度的代码立即运行,而是排队等待运行循环的下一次迭代。这允许自动释放池耗尽,让当前方法完成(并释放它可能已经使用的任何资源),让其他调度任务先运行,让UI有机会反映您可能已启动的任何更改等。

一些开发人员可能会这样做的一些例子包括:

  1. 如果你想要一个递归的方法调用本身,你可能会使用这种模式,但你想要回到运行循环,让资源被释放,让UI反映任何变化,等等。你基本上说“好吧,让这个方法完成,但在下一个运行循环中,再次运行此方法。”

  2. 更可疑的是,我在viewDidLoad中看到了这种模式,你想让自动布局有机会“赶上”并更新帧。例如。如果您只是从viewDidLoad调用它,则会有一个常见的第三方进度指示器无法正常工作,但如果您将该更新发送回主队列,它就会起作用。

  3. 由于明确说明了为什么我看到开发人员从主队列本身调回主队列,我必须承认这些模式中的许多都受到代码异味的影响,并且通常通过不同的模式更好地完成。但这些是我见过的一些例子。

    但是,如果您需要有关特定代码示例的帮助,则必须与我们分享。如果没有看到代码示例,我们无法分辨开发人员的意图。