在这里,我有一个关于线程之间差异的查询


DispatchQueue.global().syncDispatchQueue.global().asyncDispatchQueue.main.syncDispatchQueue.main.sync之间的区别


这是我从事研发工作的一些问题。


Difference Between DispatchQueue.sync vs DispatchQueue.async
Is DispatchQueue.global(qos: .userInteractive).async same as DispatchQueue.main.async
What does main.sync in global().async mean?
main.async vs main.sync() vs global().async in Swift3 GCD
Difference between DispatchQueue.main.async and DispatchQueue.main.sync


当我在代码下方使用DispatchQueue.global().syncDispatchQueue.global().asyncDispatchQueue.main.async时,它可以完美地工作

func loadimage(_ url: URL)
{
    DispatchQueue.global().sync { // Here i used DispatchQueue.main.async , DispatchQueue.global().async and DispatchQueue.main.async
         if let data1 = try? Data(contentsOf: url){
           if let img = UIImage(data: data1){
             DispatchQueue.main.async {
                self.imgView.image = img
             }
           }
        }
    }
}


但是当我使用DispatchQueue.main.sync时,应用程序崩溃了。

func loadimage(_ url: URL)
{
    DispatchQueue.main.sync {
         if let data1 = try? Data(contentsOf: url){
           if let img = UIImage(data: data1){
             DispatchQueue.main.async {
                self.imgView.image = img
             }
           }
        }
    }
}


我在DispatchQueue.main.sync上遇到以下错误


  线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

最佳答案

如果调用print(Thread.isMainThread),则可能会看到1作为输出。如果是这样,则您的代码已在主队列中执行。

DispatchQueue.main.sync函数暂停当前线程,直到执行代码。但是,如果您在主队列中运行,则暂停主队列并尝试在主队列中执行任务。但是它停了下来。如果您从后台队列调用它,我们将:


暂停bg队列
在主队列中执行任务
继续在bg队列中。


此逻辑适用于serial队列,例如main队列。


如果执行async任务,则只需将该任务放入队列中就不会暂停。当队列中的所有其他任务完成时,您的代码开始执行。

如果您有concurent队列,则此代码可能会正常工作。并发队列可以在执行时在任务之间切换。您可以在此topic中了解更多信息。

关于ios - Swift4中的异步DispatchQueue和多线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57460413/

10-11 03:33