GCD(一)
2998 ワード
GCD(一)
GCDには3つのキュータイプがあります.
キューの作成
ユーザーキューを使用する場合は、関数を呼び出して作成します.
dispatch_queue_create(, );
関数の最初のプロパティはラベルで、debugのために使用されます.バックドメイン名でキューの名前を付けるのが望ましいです.2番目のパラメータは役に立たないので、NULLを入力すればいいです.
ジョブの発行(Job)
ジョブをキューにコミットするのは簡単です.dispatch_を呼び出すasync関数は、キューとblockを入力します.
//
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self dosomeThing];
NSLog(@"dispatch_async in ViewDidLoad");
// job , ,
dispatch_async(dispatch_get_main_queue(), ^{
//
NSLog(@"update UI in main_queue");
});
});
dispatch_async ,block 。
//
// block
// __block , block ,
__block NSString *str ;
dispatch_sync(dispatch_get_main_queue(), ^{
str = [_myLabel.text copy];
});
// block , ,
dispatch_queue_t bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(dispatch_get_main_queue(), ^{
NSString *str = [_myLabel.text copy];
dispatch_async(bgQueue, ^{
//use
});
});
, , , block , 。
ロックは適用されません
ここではまずdispatch_について説明しますsyncとdispatch_asyncのワークフロー
dispatch_sync(queue,block)は2つのことをしました
* block queue ;
* , block , 。
dispatch_async(queue,block)も2つのことをしました
* block queue ;
* ( )
どうやって同期ロックを実現しますか?実は、私たちのデータが同じシリアル同期キューで実行されるだけでいいです.
このような機能を実現するためにはDISPATCHが必要です.QUEUE_SERIALキュー、すなわちユーザキュー.
_syncQueue = dispatch_queue_create("com.kingandyoga.syncQueue", NULL);
//get
- (NSString *)someString
{
__weak NSString *localSomeString;
dispatch_sync(_syncQueue, ^{
localSomeString = _someString;
});
return localSomeString;
}
//set
- (void)setSomeString:(NSString *)someString
{
dispatch_sync(_syncQueue, ^{
_someString = someString;
});
}
ただし、設定方法は必ずしも同期である必要はなく、インスタンス変数を設定するblockは値を返さないので、この方法を非同期に変更することができます.
- (void)setSomeString:(NSString *)someString
{
dispatch_async(_syncQueue, ^{
_someString = someString;
});
}
今回はdispatch_をsyncをdispatch_に変更asyncは,呼び出し者から見て実行速度を向上させた.非同期配布dispatch_が実行されたからこそasyncはblockをコピーし、blockをコピーする時間がblockを実行する時間より大きい場合、dispatch_asyncの速度はdispatchより速くなります.syncの速度はもっと遅い.実際にはblockが実行するタスクの重さに応じてdispatch_の使用を決定する必要があります.asyncかdispatch_かsync.