iOS開発:SwiftマルチスレッドGCDの使用

4773 ワード

前の記事で述べたNSThreadスレッドに加えて、GCD(Grand Central Dispath)は、Appleが新たに開発したマルチコアプログラミングを解決するソリューションであり、CPUリソースを十分に利用し、すべてのタスクを1つのタスクキューに配置してスケジューリングする.GCDのデフォルトでは、アプリケーション全体で使用できるグローバルな同時キューが用意されており、作成する必要はありません.
同期と非同期の違い
dispatch_sync同期:スレッドを開く能力を備えていないdispatch_async非同期:スレッドを開く能力を備える

タスクの実行方法
同時キュー:複数のタスクが同時に実行され、「非同期」は1ステップの関数でのみ実行できます.
シリアルキュー:タスクを次から次へ実行する
注意:一般的に実際の開発で最もよく使われるのはdispatch_です.async .
次に、一般的なキューの使用方法について説明します.
1:最も一般的なグローバル同時キュー:
      // 
        let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        //   
        dispatch_async(queue) { () -> Void in
            //doSomething... 1
        }
        dispatch_async(queue) { () -> Void in
            //doSomething... 2
        }
        dispatch_async(queue) { () -> Void in
            //doSomething... 3
        }
        
        // 
        dispatch_suspend(queue)
        // 
        dispatch_resume(queue)

 
2:シリアルキュー、キュー内のタスクは同時に実行されず、1つのタスクが完了した後に別のタスクを実行します.
 // 
        let serialQueue = dispatch_queue_create("dispatch_queue_name", nil)
        //   
        dispatch_async(serialQueue) { () -> Void in
            //doSomething...  1
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething...  2
        }
        dispatch_async(serialQueue) { () -> Void in
            //doSomething...  3
        }

 
3:GCDスレッド間の通信は、通常、サブスレッドがデータを要求し、メインスレッドに戻ってUIを更新するために使用される
 // 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            //  
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                // UI...
            })
        }

 
四:スレッド遅延実行
    // 
        let second:Double = 3.0
        let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(second * Double(NSEC_PER_SEC)))
        
        //3s 
        dispatch_after(dtime, dispatch_get_main_queue()) { () -> Void in
            
        }
        //3s 
        dispatch_after(dtime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            
        }

 
五:使い捨てコードは、その名の通り、適用ライフサイクル内にブロック内のコードブロックが一度しか実行されません.
      var once:dispatch_once_t = 0
        dispatch_once(&once, { () -> Void in
            // 
        })
      

 
六:キューグループ:一部のタスクをキューグループに入れ、すべてのタスクの実行が完了すると、グループのnotifyが実行されます.
    /********************************** ******************************************/
        let group = dispatch_group_create()
        let groupQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
        dispatch_group_async(group, groupQueue){ () -> Void in
            // 1
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            // 2
        }
        dispatch_group_async(group, groupQueue){ () -> Void in
            // 3
        }
        dispatch_group_notify(group, groupQueue) { () -> Void in
            //  1、 2、 3 
        }

 
 
終わりだ!