iOS開発:SwiftマルチスレッドGCDの使用
4773 ワード
前の記事で述べたNSThreadスレッドに加えて、GCD(Grand Central Dispath)は、Appleが新たに開発したマルチコアプログラミングを解決するソリューションであり、CPUリソースを十分に利用し、すべてのタスクを1つのタスクキューに配置してスケジューリングする.GCDのデフォルトでは、アプリケーション全体で使用できるグローバルな同時キューが用意されており、作成する必要はありません.
同期と非同期の違い
dispatch_sync同期:スレッドを開く能力を備えていないdispatch_async非同期:スレッドを開く能力を備える
タスクの実行方法
同時キュー:複数のタスクが同時に実行され、「非同期」は1ステップの関数でのみ実行できます.
シリアルキュー:タスクを次から次へ実行する
注意:一般的に実際の開発で最もよく使われるのはdispatch_です.async .
次に、一般的なキューの使用方法について説明します.
1:最も一般的なグローバル同時キュー:
2:シリアルキュー、キュー内のタスクは同時に実行されず、1つのタスクが完了した後に別のタスクを実行します.
3:GCDスレッド間の通信は、通常、サブスレッドがデータを要求し、メインスレッドに戻ってUIを更新するために使用される
四:スレッド遅延実行
五:使い捨てコードは、その名の通り、適用ライフサイクル内にブロック内のコードブロックが一度しか実行されません.
六:キューグループ:一部のタスクをキューグループに入れ、すべてのタスクの実行が完了すると、グループのnotifyが実行されます.
終わりだ!
同期と非同期の違い
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
}
終わりだ!