iOSマルチスレッド開発シリーズの(3)Grand Central Dispatch(GCD)
2945 ワード
上の2編ではNSThreadとNSOperationの使い方を紹介していますが、この3つ目のマルチスレッド開発GCDの紹介です
紹介:
GCDはアップル社がiOS 4+以降に発売したマルチスレッド技術であり、アップルが力を入れて推薦したものでもある.C言語に基づいて開発されたため、効率性は比類がないが、学習の難しさは他の2つ以上かもしれない.
シリアルキューの作成 dispatch_を使用queue.create関数 プライマリ・キューの使用:dispatch_の使用get_メーンQueue()獲得ホームチーム列 最初のパラメータはキューの名前で、デバッグするときに役立ちます.アップルのお勧めは、com.baidu.wwwなどの逆会社のウェブサイト名です.
2番目のパラメータは、nilまたはDISPATCH_の場合、キューのタイプです.QUEUE_SERIALはシリアルキュー
並列キューの作成
2番目のパラメータは次のように設定されています.
最初のパラメータでは、並列キューの優先度を設定できます.上位、中、下位の3つの優先度キューに分けられます.
同期タスクの作成
非同期タスクの作成
いくつかの状況をシミュレートします
ケース1:タスクを一度に実行する(単一モードで使用)
ケース2:大量のネットワークリクエスト
ケース3:N秒遅延であるタスクを実行する:
ケース4:データのロードが完了した後、バックグラウンドでデータを保存する(キャッシュ時)
ケース5:キューに参加する前のblockが実行されてから実行され、実行が完了するとキューに参加した後のblockが実行されます.
ケース6:非常に多くのデータはマルチスレッド処理を必要とし、処理が遊ばない後に1つのメインスレッドにまとめて実行する(ケース1のシナリオと一致する)
GCDのもう一つの応用
ホームキーをクリックしてアプリケーションを閉じると、5秒後にこのアプリケーションがメモリで実行されなくなり、GCDを利用してアプリケーションが10分間バックグラウンドで生存できるようになり、収集されていないデータをサーバに軽く転送し、データの保存整理とまとめを行うことができます.
紹介:
GCDはアップル社がiOS 4+以降に発売したマルチスレッド技術であり、アップルが力を入れて推薦したものでもある.C言語に基づいて開発されたため、効率性は比類がないが、学習の難しさは他の2つ以上かもしれない.
シリアルキューの作成
dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
2番目のパラメータは、nilまたはDISPATCH_の場合、キューのタイプです.QUEUE_SERIALはシリアルキュー
dispatch_queue_t queue = dispatch_get_main_queue(); ( )
並列キューの作成
dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
2番目のパラメータは次のように設定されています.
DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t queue=dispatch_get_global_queue(long identifier, unsigned long flags);
最初のパラメータでは、並列キューの優先度を設定できます.上位、中、下位の3つの優先度キューに分けられます.
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
同期タスクの作成
dispatch_sync(queue, ^{
//block
});
非同期タスクの作成
dispatch_async(queue, ^{
//block
});
いくつかの状況をシミュレートします
ケース1:タスクを一度に実行する(単一モードで使用)
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// code to be executed once
});
ケース2:大量のネットワークリクエスト
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//
dispatch_sync(dispatch_get_main_queue(), ^{
// UI
});
});
ケース3:N秒遅延であるタスクを実行する:
double delayInSeconds = N;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
ケース4:データのロードが完了した後、バックグラウンドでデータを保存する(キャッシュ時)
dispatch_async(dispatch_get_global_queue(0, 0), ^{
});
ケース5:キューに参加する前のblockが実行されてから実行され、実行が完了するとキューに参加した後のblockが実行されます.
dispatch_barrier_async(dispatch_queue_t queue, ^{
});
ケース6:非常に多くのデータはマルチスレッド処理を必要とし、処理が遊ばない後に1つのメインスレッドにまとめて実行する(ケース1のシナリオと一致する)
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
//
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
//
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
//
});
GCDのもう一つの応用
ホームキーをクリックしてアプリケーションを閉じると、5秒後にこのアプリケーションがメモリで実行されなくなり、GCDを利用してアプリケーションが10分間バックグラウンドで生存できるようになり、収集されていないデータをサーバに軽く転送し、データの保存整理とまとめを行うことができます.