GCD vs performSelectorInBackground/performSelectorOnMainThread

YU *_*ENG 21 objective-c nsthread ios

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

谢谢!!

Rob*_*ier 33

何时使用 performSelectorInBackground:

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

何时使用 performSelectorOnMainThread:

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

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

请务必阅读Apple的"远离线程迁移"以获取更多信息.

  • 是的,我并没有真正指向或远离特定的API.只是提醒他们,他们并不是严格的互相替换. (2认同)