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

我和一个朋友聊天,他告诉我他听说使用 dispatch_async 不是很好,但他不知道为什么。

我在谷歌上查了一下,没有发现这段代码错误的任何原因

如何改进此代码?有没有更好的方法来做到这一点?

注意:我还在学习 iOS 编程,所以我对这一切都很陌生。

4

2 回答 2

5

您的朋友错误地认为 dispatch_async 是“坏的”。

但是要求另一个处理器做像 becomeFirstResponder 这样简单的事情是没有意义的!设置调度需要一些时间,而成为第一响应者几乎不需要时间。更糟糕的是,如果作为第一响应者的副作用可能涉及需要在主线程上完成的事情,例如绘图。

使用 dispatch_async 将处理器或网络密集型任务转移到其他线程。专门阅读 Grand Central Dispatch 和一般的并发编程。它很强大,但就像所有强大的编程结构一样,如果您不了解自己在做什么,它可能会导致麻烦。

您的朋友可能一直在想的只是 iPhone 和 iPad 没有典型的 Macintosh 那么多的处理核心,而且有些只有一个核心。在这些方面,您不会获得一次使用多个处理器的好处。但是仍然有充分的理由来执行异步获取网页之类的操作,因此它们不会中断滚动或导航动画之类的操作。

于 2013-02-15T03:46:33.070 回答
3

我不确定你的朋友指的是什么,但

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

dispatch_async 非常健壮。作为新手,您将主要使用它在与 UI 不同的队列中运行一些密集的代码,以便 UI 保持响应,并且一旦您有了一个值(或图像或任何与您需要更新的 UI 相关的内容),您将最终像上面那样调用主队列。

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

于 2013-02-15T03:47:00.930 回答