GCD vs performSelectorInBackground / performSelectorOnMainThread

时间:2013-10-21 17:18:43

标签: ios objective-c nsthread

我是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和阻塞队列感到困惑.....)

  3. 谢谢!

2 个答案:

答案 0 :(得分:33)

何时使用performSelectorInBackground:

从不。不要使用这种方法。它产生了无限数量的线程。即使在GCD可用之前,这也是一种可怕的方法。

何时使用performSelectorOnMainThread:

嗯......从来没有,但仅仅是因为它不方便。这种方法没有什么大不了的。它没有dispatch_async()那么有用。

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

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

答案 1 :(得分:2)

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

相关问题