我一直在使用DispatchQueue.main.async很长一段时间来执行一些与UI相关的操作.但Swift提供了DispatchQueue.main.async和DispatchQueue.main.sync,两者都在主队列中执行.那么有谁可以告诉我他们之间的区别?我什么时候应该使用它们?先感谢您.
DispatchQueue.main.async {
self.imageView.image = imageView
self.lbltitle.text = ""
}
DispatchQueue.main.sync {
self.imageView.image = imageView
self.lbltitle.text = ""
}
Run Code Online (Sandbox Code Playgroud) 在其他一些方面,有以下两种方式来获取队列GCD:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_main_queue();
Run Code Online (Sandbox Code Playgroud)
如果我没有完全错误,"主队列"正在主线程上执行,并且适用于执行UI工作的"回调"块.
这是否意味着"全局队列"是在后台线程上运行的?
我正在阅读关于GCD调度队列的文档,并且在其中他们说队列是FIFO,所以我想知道这对异步/同步调度有什么影响?
从我的理解异步执行事情的顺序,它获取的东西,而同步执行串行..
但是当你编写你的GCD代码时,你决定了事情发生的顺序..所以只要你知道你的代码中发生了什么,你应该知道事情执行的顺序.
我的问题是,这里有异步的好处吗?我对这两件事的理解中遗漏了什么.
示例A: - 这会导致App Crash.
DispatchQueue.main.async {
let url = URL(string: imageUrl)
do {
let data = try Data(contentsOf: url!)
DispatchQueue.main.sync {
self.imageIcon.image = UIImage(data: data)
}
}
Run Code Online (Sandbox Code Playgroud)
例B: - 但事实并非如此
DispatchQueue.global().async {
let url = URL(string: imageUrl)
do {
let data = try Data(contentsOf: url!)
DispatchQueue.main.sync {
self.imageIcon.image = UIImage(data: data)
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,
Quest1: - 那么为什么我的应用程序在后台线程(即main.async)执行任务时崩溃,而不是调用主线程来更新UI.
Quest2: - main.async和global().async有什么区别.
ios ×4
asynchronous ×2
concurrency ×2
iphone ×2
swift ×2
swift3 ×2
execution ×1
synchronous ×1