我是ios开发的新手。我有以下问题:
这两者之间的区别是什么。
我知道当我们使用performSelectorInBackground时,我们会创建一个新的NSThread。但是当我们使用dispatch_group_async时,它们是否相同?因为如果我们创建多个dispatch_group_async,则意味着我们需要在队列中提交多个块。这些块可能在不同的队列上运行。因此,当我们创建多个dispatch_group_async时,是否意味着我们创建了一个新线程? (因为块可能在不同的队列上运行)(我对NSThread和阻塞队列感到困惑.....)
谢谢!
答案 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之上,并提供更大的灵活性和很少的开销),但请确保在使用块时不要创建保留周期。