2016-09-01 2 views
-1

私のアプリケーションのためにいくらかの並行性を得ることに取り組んでいます。私はコードのスニペットを持っていますが、それはスレッドが存在するかどうか不思議です。DISPATCH_QUEUE_PRIORITY_BACKGROUNDを使用すると、メインスレッドでdispatch_syncが機能しているのはなぜですか?

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

理由I混乱している、私は(考えて)背景のスレッドを指定しています。私の理解から、バックグラウンドスレッドに作業をディスパッチしている間、メインスレッドを待機させています。しかし、それは起こっていることではなく、メインスレッドは引き続き作業を行います。これはOSによって最適化されていますか?この作業は別のスレッドで行う必要がありますか?

私の理論がどこで間違っているかを明確にすることはできますか?

答えて

2

私はメインスレッドでdispatch_syncが呼び出されると信じているので、ブロックが実行されるまでメインスレッドがブロックされるので、メインスレッドがブロックして何もできないので、メインスレッドを使ってブロックを実行してください?私はそれがGCDの最適化だと思う。

The GCD Referenceは言う:

最適化として

は、この機能が可能な場合、現在のスレッド上のブロックを呼び出します。

dispatch_queueに送信したブロックがどのスレッドでも実行されると仮定することはできません。ディスパッチキューは特定のスレッド(メインキューを除く)にはアタッチされません。

+0

説明をいただきありがとうございます – Aggressor

関連する問題