GCD vs performSelectorInBackground / performSelectorOnMainThread

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

  1. 当我们使用GCD(dispatch_group_async,dispatch_async(dispatch_get_main_queue()…)和当我们使用performSelectorInBackground / performSelectorOnMainThread?
  2. 这两者有什么不同?

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

谢谢!!

何时使用performSelectorInBackground:

决不。 不要使用这种方法。 它产生了无数的线程。 甚至在GCD可用之前,这是一个可怕的方法。

何时使用performSelectorOnMainThread:

呃…永远不要,只是因为不方便。 这种方法没有什么大错。 这只是不如dispatch_async()有用。

GCD和旧的performSelector…方法(和一般的NSThread )之间的区别在于GCD为你pipe理一个线程池。 一般来说,你应该避免在Cocoa中手动线程。 相反,使用NSOperationQueue或GCD( dispatch方法)。 它们提供了更有用的队列抽象,而不是强迫你手动pipe理线程。

请务必阅读苹果从线程迁移的更多信息。

实际上,在iOS 4.0之后,我找不到任何使用performSelectorInBackground / onMainThread的理由。 如果您需要在后台执行某些操作,则可以使用GCD(或者更好的是,从4.0开始,在GCD之上构build的NSOperationQueue ),并且在开销较小的情况下提供更大的灵活性,但不要在使用块时创build保留周期。