为什么dispatch_sync在使用DISPATCH_QUEUE_PRIORITY_BACKGROUND时在主线程上工作?

时间:2016-09-01 23:10:49

标签: 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, update the user location
        for location in locations
        {
            self.updateUserLocation(location)
        }
    }
}

func updateUserLocation(location:CLLocation)
{        
    _controller?.centerMapOnUser()
}

当我运行此代码时,此代码正确(根据我认为正在发生的情况)被分派到另一个线程。

enter image description here

令我困惑的是为什么将调度调用更改为sync使其在主线程上运行:

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0))

原因:

enter image description here

我感到困惑的原因是,我(想)指定一个后台线程。根据我的理解,我将主线程等待,同时我将工作分配给后台线程。但是,这并没有发生,主线程仍在继续。这是由操作系统完成的优化吗?这个工作应该在另一个线程上完成吗?

你能澄清一下我的理论错在哪里吗?

1 个答案:

答案 0 :(得分:2)

我相信在主线程上调用locationManagerdispatch_sync将导致主线程被阻塞,直到块完成执行,因此主线程将阻塞并且无法执行任何操作,为什么不使用执行块的主线程?我认为这是GCD的优化。

The GCD Reference说:

  

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

你不能假设你提交的阻止dispatch_queue会在任何线程中执行,dispatch_queue不会附加到任何特定的线程(主队列除外)。