我最近做了很多GCD和异步渲染和数据检索工作,我真的需要确定关于如何完成异步的心智模型。
我想专注于setNeedsDisplay
和NSURLConnectionDelegate
方法套件。
dispatch_async(dispatch_get_main_queue(), ^{})
来称呼它,这让我很困惑。NSURLConnectionDelegate
回调被描述为异步,但它们实际上并不在主线程/ runloop上同时运行。我对这种区别很模糊。更广泛地说,在GCD的现代iOS时代,制作GCD的最佳实践是什么,这些方法可以很好地结合在一起。我只是在寻找一般指导方针,因为我经常使用它们,而我只是想尽量不让自己陷入困境。
干杯,
道格
答案 0 :(得分:0)
不,您通常不会异步调用setNeedsDisplay
。但是如果你从主队列以外的队列中调用它(我猜你是这样),那么你应该注意到你永远不应该从后台队列进行UI更新。您始终从主队列中运行它们。因此,这看起来像是将UI更新从后台队列调度到主队列的典型模式。
NSURLConnection
被描述为异步,因为当您调用它时,除非您使用sendSynchronousRequest
,否则您的应用会在连接进行时立即返回。委托事件在主队列上的事实与连接本身是异步的概念不相容。就个人而言,如果我可以从一个启动进程的同一队列中调用一些委托方法,我会认为这是一种不好的形式,除非通过接口相当明确。
关于你的问题标题的问题,NSURLConnection
是否在内部使用GCD,而不是另一种并发技术(NSOperationQueue
,线程等),这是一个内部实现问题,我们作为应用程序开发人员,一般不用担心。
关于指导方针的最终后续问题,我自愿遵守上面提到的一般规则。也就是说,应该将所有阻塞用户界面的耗时进程分派到后台队列,但后台队列所需的任何后续UI更新都应该被分派回主队列。这是我能想到的最一般的经验法则,它概括了为什么我们通常concurrent programming以及如何正确地做到这一点。