GCD学習(一)
3877 ワード
IOSがマルチスレッドを使用するには、NSThread、NSOperation、NSOperationQueue、GCDの3つの方法がある.
GCD学習(一)
(1)非同期と同期
(2)パラレルキューとシリアルキュー
(3)タスクグループ
(4)プロセス同期を実現するためにdispatch_group_enter、dispatch_group_leave、dispatch_group_wait
(5)信号量(制御同時)
インスタンス1プログラムの実行では、まず10個の新しいスレッドが作成され、その後、スレッドの実行が終了するたびにスレッドが作成されます.インスタンス2 5秒後に「haha~,I am get data complete」を出力します.
GCD学習(一)
(1)非同期と同期
dispatch_sync(queue, ^{
NSLog(@" ");
});
dispatch_async(queue, ^{
NSLog(@" ");
});
(2)パラレルキューとシリアルキュー
//
//dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//
dispatch_queue_t concurrentQuueue = dispatch_queue_create("com.itt.crq", DISPATCH_QUEUE_CONCURRENT);//
dispatch_async(concurrentQuueue, ^{
NSLog(@"task1");
});
dispatch_async(concurrentQuueue, ^{
NSLog(@"task2");
});
//
dispatch_queue_t serialQueue = dispatch_queue_create("con.itt.srq", DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{
NSLog(@"task1");
});
dispatch_async(serialQueue, ^{
NSLog(@"task2");
});
(3)タスクグループ
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, myQueue, ^{
NSLog(@"task1");
});
dispatch_group_async(group, myQueue, ^{
NSLog(@"task1");
});
dispatch_group_async(group, myQueue, ^{
NSLog(@"task3");
});
NSLog(@"wait 1 2 3");
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"task 1 2 3 finished");
(4)プロセス同期を実現するためにdispatch_group_enter、dispatch_group_leave、dispatch_group_wait
//dispatch_group_enter dispatch_group_leave
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_enter(group);
dispatch_group_async(group, myQueue, ^{
NSLog(@"again");
sleep(5);
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_group_async(group, myQueue, ^{
NSLog(@"next");
sleep(10);
dispatch_group_leave(group);
});
NSLog(@"start");
NSLog(@"waiting");
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//dispatch_group_wait
NSLog(@"finish");
(5)信号量(制御同時)
:
dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i = 0; i < 100; i++)
{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_group_async(group, queue, ^{
NSLog(@"%i",i);
sleep(2);
dispatch_semaphore_signal(semaphore);
});
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(queue, ^{
NSLog(@"waiting create data");
sleep(5);
NSLog(@"create data complete");
dispatch_semaphore_signal(semaphore);
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(queue, ^{
NSLog(@"haha~,I am get data complete");
});
インスタンス1プログラムの実行では、まず10個の新しいスレッドが作成され、その後、スレッドの実行が終了するたびにスレッドが作成されます.インスタンス2 5秒後に「haha~,I am get data complete」を出力します.