GCD:シリアル/パラレル/ホームキューの下、同期/非同期の実行方法
3711 ワード
GCDでは、さまざまなタイプのキューを取得します.
シリアルキュー非同期実行タスク非同期は新しいスレッドを作成する能力があり、新しいスレッドを開いてタスクを実行します. は、シリアル方式でタスクを実行する.
シリアルキュー同期タスクの実行同期は新しいスレッドを作成する能力がなく、新しいスレッドを開いてタスクを実行することはなく、現在の にあります.のプログラムのメインスレッドでタスクを実行します.タスクをシリアルで実行します.
同時キュー非同期実行タスク(共通)非同期は新しいスレッドを作成する能力を持ち、新しいスレッドを開いてタスクを実行し、現在のプログラムのメインスレッドでタスクを実行しない. は、同時にタスクを実行します.
同時キュー同期タスクの実行同期は新しいスレッドを作成する能力がなく、新しいスレッドを開いてタスクを実行することはなく、現在のプログラムのメインスレッドでタスクを実行します. は、同期に従ってタスクを実行する.
プライマリ・キューの同期(プログラムのデッドロックを引き起こす)
//
dispatch_queue_t singalQueue = dispatch_queue_create("single",DISPATCH_QUEUE_SERIAL);
//
dispatch_queue_t concrtQueue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
//
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// ( )
dispatch_queue_t gobalqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
シリアルキュー非同期実行タスク
- (void)singalAsynQueue{
//
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
// singalQueue ( )
[self asynWithQueue: singalQueue];
}
シリアルキュー同期タスクの実行
- (void)singalSynQueue{
//
dispatch_queue_t singalQueue = dispatch_queue_create("singal", DISPATCH_QUEUE_SERIAL);
// singalQueue ( )
[self synWithQueue: singalQueue];
}
同時キュー非同期実行タスク(共通)
- (void)concrtAsynQueue{
//
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// concrtQueue ( )
[self asynWithQueue:concrtQueue];
}
同時キュー同期タスクの実行
- (void)concrtSynQueue{
//
// dispatch_queue_t concrtQueue = dispatch_queue_create("concrtQueue", DISPATCH_QUEUE_CONCURRENT);
//
dispatch_queue_t concrtQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// concrtQueue ( )
[self synWithQueue:concrtQueue];
}
プライマリ・キューの同期(プログラムのデッドロックを引き起こす) - (void)mainSynQueue{
//
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// mainQueue ( )
[self synWithQueue:mainQueue];
}
プライマリ・キューの非同期(プライマリ・スレッドで順次実行)
, (FIFO) 。
- (void)mainAsynQueue{
//
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// mainQueue ( )
[self asynWithQueue:mainQueue];
}
非同期メソッドの実装 - (void)asynWithQueue:(dispatch_queue_t)queue{
NSLog(@"%@",[NSThread currentThread]);
dispatch_async(queue, ^{
NSLog(@"----1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4----%@",[NSThread currentThread]);
});
NSLog(@"--------end------------");
}
同期メソッドの実装 - (void)synWithQueue:(dispatch_queue_t)queue{
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(queue, ^{
NSLog(@"----1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----3----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----4----%@",[NSThread currentThread]);
});
NSLog(@"--------end------------");
}
- (void)mainSynQueue{
//
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// mainQueue ( )
[self synWithQueue:mainQueue];
}
, (FIFO) 。
- (void)mainAsynQueue{
//
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// mainQueue ( )
[self asynWithQueue:mainQueue];
}
- (void)asynWithQueue:(dispatch_queue_t)queue{
NSLog(@"%@",[NSThread currentThread]);
dispatch_async(queue, ^{
NSLog(@"----1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4----%@",[NSThread currentThread]);
});
NSLog(@"--------end------------");
}
同期メソッドの実装 - (void)synWithQueue:(dispatch_queue_t)queue{
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(queue, ^{
NSLog(@"----1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----3----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----4----%@",[NSThread currentThread]);
});
NSLog(@"--------end------------");
}
- (void)synWithQueue:(dispatch_queue_t)queue{
NSLog(@"%@",[NSThread currentThread]);
dispatch_sync(queue, ^{
NSLog(@"----1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----3----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----4----%@",[NSThread currentThread]);
});
NSLog(@"--------end------------");
}