GCD主线程崩溃问题(需要说明)?

时间:2018-02-06 08:39:46

标签: ios iphone swift multithreading grand-central-dispatch

为什么这段代码导致崩溃?

 DispatchQueue.main.sync {
        // Operation To Perform 
 }

为什么我们必须这样写: -

DispatchQueue.global().async(execute: {
    print("test")
    DispatchQueue.main.sync{
        print("main thread")
    }
})

当我们在CellForRowAt中编写代码或者其中主线或全局线程如何以同步或异步方式工作的任何其他方法时?

3 个答案:

答案 0 :(得分:1)

为什么会短暂崩溃

DispatchQueue.main.sync {
    // Operation To Perform 
}
  

调用同步和目标当前队列是一个死锁(调用队列等待同步块完成,但它没有启动,因为目标队列(相同)忙于等待同步调用完成)这可能是崩溃的原因。

对于第二个块:您正在创建全局队列,然后您将获得主队列,因此现在没有死锁

如果您曾经使用semaphore,如果您不注意,则会遇到同样的问题 如果您阻止wait,它有两个方法signalwait以及main thread,那么您的代码将永远不会被执行。

希望它有用

答案 1 :(得分:1)

enter image description here

根据Apple ,尝试在主队列上同步执行工作项会导致死锁

因此编写DispatchQueue.main.sync {}会导致死锁情况,因为应用程序执行的所有UI操作都是在主队列上执行,除非我们在后台队列上手动切换某些任务。这也回答了关于调用哪个线程 CellForRowAt 的问题。所有与UI操作或UIkit相关的方法都是从主线程

调用的

同步执行任务意味着阻塞线程直到任务未完成,在这种情况下,您试图阻止系统/应用程序已经执行某项任务并且可能导致死锁的主线程。根本没有建议阻止主线程,这就是为什么我们需要异步切换到后台线程,以便不阻塞主线程。

要了解更多信息,请访问以下链接: https://developer.apple.com/documentation/dispatch

答案 2 :(得分:0)

 DispatchQueue.main.sync {
     // Operation To Perform 
 }

在您已经打开的串行队列(如main)上调用同步将导致死锁。第一个过程无法完成,因为它正在等待第二个过程完成,因为它等待第一个完成等等,所以无法完成。

DispatchQueue.global().async(execute: {
    print("test")
    DispatchQueue.main.sync{
        print("main thread")
    }
})

从此处调用主线程上的sync可以帮助您将任务移动到global()队列。

在raywenderlich.com上有一个很棒的2部分GCD教程,我建议你阅读https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1