iOS開発のGCD使用
9151 ワード
iOS開発のGCD使用
(1)GCDを使って非同期タスクを作成する
(2)アナログネットワークのダウンロード
(3)一度だけ実行し、一例を実現する(推奨される実装方式、スレッドセキュリティ)
(4)遅延実行
(5)通知と同時に複数のタスクを非同期的に実行し、すべてのタスクのダウンロードが完了するのを待つ(サンダーのような)
(1)GCDを使って非同期タスクを作成する
#pragma mark - GCD
- (void)createAsyncTask
{
//
// 1: queue, 3 queue
//main queue (UI )
//global queue ( )
// queue
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
for (int i=0; i<20; i++) {
NSLog(@"A = %d",i);
}
});
dispatch_async(queue, ^{
for (int i=0; i<20; i++) {
NSLog(@"B = %d",i);
}
});
}
(2)アナログネットワークのダウンロード
#pragma mark -
- (void)simulateNetwordDownload
{
_progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(10, 100, 300, 20)];
[self.view addSubview:_progressView];
//GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<100; i++) {
// UI
// progressView.progress+=0.01;
//(1) UI dispatch_get_main_queue() : UI
dispatch_async(dispatch_get_main_queue(), ^{
_progressView.progress+=0.01;
});
[NSThread sleepForTimeInterval:0.1];
}
//(2)
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@" " message:@" " delegate:self cancelButtonTitle:@" " otherButtonTitles: nil];
[alert show];
});
//(1)(2) , (1) (2)
});
}
(3)一度だけ実行し、一例を実現する(推奨される実装方式、スレッドセキュリティ)
#pragma mark - , ( , )
- (void)runOnce
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@" ");
});
}
(4)遅延実行
#pragma mark -
- (void)delayRun
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"1111111");
});
}
(5)通知と同時に複数のタスクを非同期的に実行し、すべてのタスクのダウンロードが完了するのを待つ(サンダーのような)
#pragma mark - , ( )
- (void)groupRun
{
//group
dispatch_group_t group = dispatch_group_create();
//7s
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<100; i++) {
NSLog(@"A = %d",i);
[NSThread sleepForTimeInterval:0.07];
}
});
//5s
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<100; i++) {
NSLog(@"B = %d",i);
[NSThread sleepForTimeInterval:0.05];
}
});
//10s
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i=0; i<100; i++) {
NSLog(@"C = %d",i);
[NSThread sleepForTimeInterval:0.1];
}
});
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@" , ");
});
}