我是ios开发的新手。我有以下问题:
- 当我们使用 GCD(dispatch_group_async, dispatch_async(dispatch_get_main_queue()...) 以及当我们使用 performSelectorInBackground/performSelectorOnMainThread 时?
-
这两者之间有什么区别。
我知道当我们使用 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 之上,并提供更大的灵活性和很少的开销),但请确保在使用块时不要创建保留周期。