努力为我的应用程序获得一些并发性。我有一段代码,我很好奇它存在什么线程。
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0))
{
// For each location, update the user location
for location in locations
{
self.updateUserLocation(location)
}
}
}
func updateUserLocation(location:CLLocation)
{
_controller?.centerMapOnUser()
}
当我运行此代码时,此代码正确(根据我认为正在发生的情况)被分派到另一个线程。
令我困惑的是为什么将调度调用更改为sync
使其在主线程上运行:
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0))
原因:
我感到困惑的原因是,我(想)指定一个后台线程。根据我的理解,我将主线程等待,同时我将工作分配给后台线程。但是,这并没有发生,主线程仍在继续。这是由操作系统完成的优化吗?这个工作应该在另一个线程上完成吗?
你能澄清一下我的理论错在哪里吗?
答案 0 :(得分:2)
我相信在主线程上调用locationManager
,dispatch_sync
将导致主线程被阻塞,直到块完成执行,因此主线程将阻塞并且无法执行任何操作,为什么不使用执行块的主线程?我认为这是GCD的优化。
作为优化,此函数会在可能的情况下调用当前线程上的块。
你不能假设你提交的阻止dispatch_queue会在任何线程中执行,dispatch_queue不会附加到任何特定的线程(主队列除外)。