我想知道我们都知道异步任务对于并发是多么必要,但我们想知道为什么我们需要同步任务。而我们可以通过功能的正常使用来实现相同的目标。
谢谢&问候
罗希特夏尔
答案 0 :(得分:1)
synchronously
时,意味着'启动该操作的线程将等待任务完成之前
继续”。 Asynchronous
意味着它不会等待完成任务。synchronous
调用会停止当前操作,并在调用返回时返回。通过asynchronous
来电,您可以继续。synchronous
与asynchronous
代码相反,因此是普通代码。答案 1 :(得分:0)
顾名思义,它有助于同步线程。
考虑GCD异步和同步(伪)
的典型用法async background_thread {
//1 call webservice or other long task that would block the main thread
sync main_thread {
//2 update UI with results from 1
}
//3 do something else that relies on 2
}
现在,如果2处于异步中并且您需要在3处执行某些依赖于2处的更新的事情,那么您无法保证(并且很可能不会)获得您期望的行为。相反,您使用sync
来确保在后台线程中继续执行之前完成任务。
如果您现在要问,为什么不在2左右取出同步/异步,以便它按顺序执行?问题是,UI不能在后台线程上更新,否则行为是未定义的(这通常意味着UI滞后很多)。所以实质上发生的是后台线程在2 {s} sync
等待,直到主线程执行该块,然后它将继续执行后台线程上的其余执行。
如果你正在处理一个不需要主线程(或其他线程)正确执行的任务,那么你也可以在2点取出sync
。
这只是同步有用的一个示例,如果您在应用中进行高级线程,则还有其他示例。
希望这有帮助
答案 2 :(得分:0)
通常,这是因为您希望在特定的不同线程上执行操作,但您需要该操作的结果。您不能异步执行操作,因为您的代码将在另一个线程上的操作完成之前继续。
Apple有一个非常好的例子:
func asset() -> AVAsset? {
var theAsset : AVAsset!
self.assetQueue.sync {
theAsset = self.getAssetInternal().copy() as! AVAsset
}
return theAsset
}
任何线程都可以调用asset
方法;但为了避免共享数据出现问题,我们要求只有从特定队列(self.assetQueue
)执行的函数才能触及AVAsset,因此当我们调用getAssetInternal
时,我们会在self.assetQueue
上执行此操作。但我们还需要通过调用getAssetInternal
返回的结果;因此调用sync
而不是async
。