iOS開発のGCD使用

9151 ワード

iOS開発のGCD使用
(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(@"");

    });



}