Ios GCD vs performSelectorInBackground/performSelectorOnMainThread

Ios GCD vs performSelectorInBackground/performSelectorOnMainThread,ios,objective-c,nsthread,Ios,Objective C,Nsthread,我是ios开发新手。我有以下问题: 当我们使用GCD(dispatch\u group\u async,dispatch\u async(dispatch\u get\u main\u queue()…)时,以及当我们使用performSelectorInBackground/performSelectorOnMainThread时 这两者有什么区别 我知道,当我们使用performSelectorInBackground时,我们会创建一个新的NSThread。但当我们使用dispatch\u

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

  • 当我们使用GCD(dispatch\u group\u async,dispatch\u async(dispatch\u get\u main\u queue()…)时,以及当我们使用performSelectorInBackground/performSelectorOnMainThread时
  • 这两者有什么区别

    我知道,当我们使用performSelectorInBackground时,我们会创建一个新的NSThread。但当我们使用dispatch\u group\u async时,情况不一样吗?因为如果我们创建多个dispatch\u group\u async,这意味着我们需要在队列中提交多个块。这些块可能会在不同的队列上运行。因此,当我们创建多个dispatch\u group\u async时sync,这是否意味着我们创建了一个新线程?(因为块可能在不同的队列上运行)(我有点混淆了NSThread和块队列…)

  • 谢谢!!

    何时使用
    性能选择背景:
    永远不要。不要使用这个方法。它会产生无限数量的线程。即使在GCD可用之前,这也是一个可怕的方法

    何时使用执行选择线程: 嗯……从来没有,只是因为它不方便。这种方法没有什么大问题。只是没有
    dispatch\u async()
    那么有用

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


    请务必阅读苹果的更多信息。

    事实上,在iOS 4.0之后,我找不到任何理由使用performSelectorInBackground/onMainThread。如果您需要在后台做一些事情,请使用GCD(或者更好的是,
    NSOperationQueue
    ,它从4.0开始就构建在GCD之上,并以较小的开销提供更大的灵活性),但在使用块时,请确保不要创建保留循环。

    dispatch\u[a]与主队列的同步并不像您想象的那样等效。它将您的代码与主运行循环绑定在一起,以不可重入的方式提供服务。有很多(公平地说,相对模糊)调度将产生不同于CFRunLoopPerformBlock或performSelectorOnMainThread的结果的情况。@Catfish\u Man,我同意存在一些细微的差异,特别是在Mac上。当NSAttributedString转换HTML时,它会泵送runloop,如果您已经在主runloop上调度了其他事情,则可能会导致死锁。以及总是存在运行循环模式和滚动的棘手情况。它们都指向使用GCD或操作队列IMO,因此建议不会改变。仅仅是方便性,这是避免PrimeStultOnMeNothType的主要原因;并且可以考虑在运行循环中的一些晦涩角落是“不方便”的一个子集。是的,我并不是真的试图指向或远离某个特定的API。只是提醒大家,它们并不是严格意义上的相互替换。我是否应该使用
    dispatch_async()
    [NSURLSession sharedSession]简单地
    显示
    UIAlertView
    .delegateQueue
    ?。我也会使用
    dispatch\u async
    执行此操作。然后您可以将所有
    UI*
    方法移动到主线程。而且更容易看到
    dispatch\u async
    中发生了什么(
    show
    没有隐藏在选择器中)。虽然
    init
    在后台可能是安全的,但最好将所有UIKit内容移动到主线程,除非您有充分的理由不这样做。这样您就不必研究每个UIKit调用以进行双重检查。顺便说一句,“似乎有效”对于线程安全来说毫无意义。高度不安全的代码可以正确工作数千次,但仍然会在现场崩溃。向主队列发送同步并不像您想象的那样等效。它会将您的代码绑定到不可重入地提供服务的主运行循环。存在大量(公平地说,相对模糊的)调度将产生不同于CFRunLoopPerformBlock或performSelectorOnMainThread的结果的情况。@Catfish_-Man,很想了解更多关于这些情况的信息。@Catfish_-Man,请详细说明,或链接到相关的问题和/或来源?谢谢这里间接提到一个问题:,其中提交到主队列的块将作为应用程序主NSRunLoop或CFRunLoop的“公共模式”的一部分执行。因此,如果您的runloop未在公共模式下运行,则主队列上的块将不会执行。对于另一个问题,CFRunLoop文档中的这一位暗指它:运行循环可以递归运行。您可以在任何运行循环调用中调用CFRunLoopRun或cfrunloopinmode,并在当前线程的调用堆栈上创建嵌套的运行循环激活。您可以在调用中运行的模式不受限制。您可以在任何可用的运行循环模式下创建另一个运行循环激活,即包括调用堆栈中已经运行得更高的任何模式”。对于调度队列,包括主队列,情况并非如此。