2013-02-15 121 views
2
 dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.teamName becomeFirstResponder]; 
    }); 

我正在和一位朋友聊天,他告诉我他听说使用dispatch_async不是很好,但他不知道为什么。dispatch_async为什么不好?完成相同任务的更好方法是什么?

我查了谷歌,为什么这个代码是错误的

我怎样才能在这个代码改进并没有发现任何理由?有没有更好的方法来做到这一点?

注:我还在学习iOS编程,所以我对这件事情是新的。

+1

您发布的代码非常好,如果从后台线程或队列中调用,则非常典型。我从来没有听说过有关dispatch_async的任何错误。 – rmaddy 2013-02-15 03:46:26

+0

dispatch_async很棒。线程是非常困难的,但派遣只会让它更容易一些。深刻理解发生的事情是关键。 – 2013-02-15 18:04:45

+0

永远不要相信程序员的意见(明确包括自己)谁不能完全告诉你为什么*有什么不好/要避免。 – LearnCocos2D 2013-09-24 16:16:31

回答

5

你的朋友错在认为dispatch_async是“坏”。

但是,要求另一个处理器像做第一个响应者那样简单,没有任何意义!建立派遣需要一些时间,并且几乎没有时间成为第一响应者。 更糟糕的是,如果作为第一响应者的副作用可能涉及诸如绘图等事情,需要在主线程上完成。

使用dispatch_async将处理器或网络密集型任务转移到其他线程。具体阅读Grand Central Dispatch,以及一般的并发编程。它功能强大,但像所有强大的编程结构一样,如果你不明白你在做什么,它可能会造成麻烦。

你的朋友可能一直在想的是,iPhone和iPad没有像典型的Macintosh那样多的处理内核,有些只有一个内核。在这些上,你不会得到一次使用多个处理器的好处。但是仍然有很好的理由来做像异步获取网页的东西,所以它们不会中断诸如滚动或导航动画之类的东西。

+6

如果从后台线程或队列调用dispatch_async,则发布的代码正确使用,因为所有UI代码都必须位于主线程中。 – rmaddy 2013-02-15 03:55:04

+0

非常正确:假设我们正在调度到一个全球队列,我很sl in。将编辑。 – 2013-02-15 04:00:50

+0

谢谢。我想是做对了,我会阅读大中央调度。 – JoseSwagKid 2013-02-15 04:04:14

3

我不知道你的朋友是指,但

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.teamName becomeFirstResponder]; 
}); 

dispatch_async是非常强大的。作为新手,您将主要使用它在与UI不同的队列中运行一些密码,以便UI保持响应,一旦您有值(或图像或任何需要更新的UI相关),您将最终如上所述调用主队列。

坚持事实..不要担心你的朋友。

+0

好的谢谢。对不起,我很担心,因为我的朋友一直在做iOS工作大约2年,而且我是全新的(1周),所以我只是假设他可能会做些什么。再次感谢 – JoseSwagKid 2013-02-15 04:03:36