GCD vs performSelectorInBackground/performSelectorOnMainThre



我是ios开发的新手。我有以下问题:

  1. 当我们使用 GCD(dispatch_group_async, dispatch_async(dispatch_get_main_queue()...) 以及当我们使用 performSelectorInBackground/performSelectorOnMainThread 时?
  2. 这两者之间有什么区别。

    我知道当我们使用 performSelectorInBackground 时,我们会创建一个新的 NSThread。但是当我们使用dispatch_group_async时,不是一样吗?因为如果我们创建多个dispatch_group_async,这意味着我们需要在队列中提交多个块。这些块可能会在不同的队列上运行。因此,当我们创建多个dispatch_group_async时,是否意味着我们创建了一个新线程?(因为块可能在不同的队列上运行)(我对NSThread和块队列有点困惑...

谢谢!!

何时使用performSelectorInBackground:

从不。请勿使用此方法。它生成无限数量的线程。甚至在GCD可用之前,这也是一种可怕的方法。

何时使用performSelectorOnMainThread:

唔......从来没有,只是因为它不方便。这种方法没有什么大问题。它只是不如dispatch_async()有用.

GCD 与旧performSelector…方法(以及一般NSThread)之间的区别在于,GCD 为您管理线程池。一般来说,你应该避免在可可中手动穿线。请改用NSOperationQueue或 GCD(dispatch方法)。它们提供了更有用的队列抽象,而不是强制您手动管理线程。

请务必阅读 Apple 的 Migration from Threads 以获取更多信息。

实际上,在iOS 4.0之后,我找不到任何使用performSelectorInBackground/onMainThread的单一理由。如果您需要在后台执行某些操作,请使用 GCD(或者更好的是,NSOperationQueue 自 4.0 以来构建在 GCD 之上,并提供更大的灵活性和很少的开销),但请确保在使用块时不要创建保留周期。

最新更新