在这里,我有一个关于线程之间差异的查询DispatchQueue.global().sync
,DispatchQueue.global().async
,DispatchQueue.main.sync
和DispatchQueue.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().sync
,DispatchQueue.global().async
和DispatchQueue.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/