Ios 为什么dispatch\u sync在使用dispatch\u QUEUE\u PRIORITY\u BACKGROUND时在主线程上工作?

Ios 为什么dispatch\u sync在使用dispatch\u QUEUE\u PRIORITY\u BACKGROUND时在主线程上工作?,ios,swift,multithreading,grand-central-dispatch,Ios,Swift,Multithreading,Grand Central Dispatch,正在为我的应用程序实现并发性。我有一段代码,我很好奇它存在于哪个线程上 func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { // For each location

正在为我的应用程序实现并发性。我有一段代码,我很好奇它存在于哪个线程上

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()
}
当我运行它时,根据我认为正在发生的事情,正确地将代码分派到另一个线程

让我困惑的是,为什么将调度调用更改为同步会使其在主线程上运行:

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0))
原因:

我之所以感到困惑,是因为我想指定一个背景线程。根据我的理解,我正在让主线程等待,同时将工作分派给后台线程。但事实并非如此,主线仍在继续工作。这是操作系统进行的优化吗?这项工作应该在另一个线程上完成吗

你能澄清一下我的理论在这方面哪里是错误的吗?

我相信在主线程上调用locationManager,dispatch\u sync将导致主线程阻塞,直到块完成执行,所以既然主线程将阻塞并且不能做任何事情,为什么不使用主线程执行块呢?我认为这是对GCD的优化

说:

作为优化,此函数在可能的情况下调用当前线程上的块

您不能假设提交给调度队列的块将在任何线程中执行,调度队列不会附加到任何特定的线程,而不是主队列