0

我最近做了很多 GCD 和异步渲染和数据检索工作,我真的需要确定关于异步是如何完成的心智模型。

我想专注于setNeedsDisplay方法NSURLConnectionDelegate套件。

  1. 异步调用 setNeedsDisplay 是否正确?我经常调用它,dispatch_async(dispatch_get_main_queue(), ^{})这让我感到困惑。
  2. 回调被描述为异步的NSURLConnectionDelegate,但它们实际上并没有在主线程/运行循环上同时运行。我对这里的区别很模糊。

更一般地说,在 GCD 的现代 iOS 时代,制作 GCD 的最佳实践是什么,这些方法可以很好地结合在一起。我只是在这里寻找一般指导方针,因为我经常使用它们并且只是尽量不让自己陷入困境。

干杯,
道格

4

1 回答 1

0
  1. 不,您通常不会setNeedsDisplay异步调用。但是,如果您是从主队列以外的队列调用它(我猜是这样),那么您应该注意,您永远不应该从后台队列进行 UI 更新。你总是从主队列运行那些。因此,这看起来像是将 UI 更新从后台队列分派到主队列的非常典型的模式。

  2. NSURLConnection被描述为异步,因为当您调用它时,除非您使用 ,否则您sendSynchronousRequest的应用程序会在连接进行时立即返回。委托事件在主队列上的事实与连接本身是异步的概念并不矛盾。就个人而言,如果我可以使用一些未从启动进程的同一队列调用的委托方法,我会认为这是一种不好的形式,除非通过接口相当明确。

  3. 对于您的问题标题的问题,是否在NSURLConnection内部使用 GCD 与其他并发技术(NSOperationQueue线程等),这是我们作为应用程序开发人员通常不担心的内部实现问题。

  4. 对于您关于指南的最后一个后续问题,我自愿提出我在上面提到的一般规则。也就是说,所有会阻塞用户界面的耗时进程都应该分派到后台队列,但是后台队列所需的任何后续 UI 更新都应该分派回主队列。这是我能想到的最普遍的经验法则,它概括了我们通常进行并发编程的原因以及如何正确地进行。

于 2013-01-10T14:07:56.873 回答