GCD多线程

多线程 

主要处理延时任务或者任务太大 影响主线程 的时候用多线程

单线程 必须要做完一件事以后 再去做另外一件事 

多线程 可以同时进行多件事  但是完成事件的时间不一定按照先后顺序实现。

使用GCD实现多线程 会简化多线程的应用开发。

队列:队列负责管理开发者提交的任务,GCD队列始终先进先出的方式来处理任务,任务的执行时间不相同,处理任务不一定先结束。

串行队列:每次只处理一个任务,必须给前一个任务完成后,才执行下一个任务,

并行队列:可以处理多个任务,将会有任务并发执行。

 

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

//    GCD 延时操作

    [self yyyyssss];

    

    [self yyyysssscccc];

    

    // 后台执行:

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        // something

    });

    

    // 主线程执行:

    dispatch_async(dispatch_get_main_queue(), ^{

        // something

    });

    

    // 一次性执行:

    static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{

        // code to be executed once

    });

    

    // 延迟2秒执行:

    double delayInSeconds = 2.0;

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        // code to be executed on the main queue after delay 

    });

    

//    高级用法,例如让后台2个线程并行执行,然后等2个线程都结束后,再汇总执行结果。

    dispatch_group_t group = dispatch_group_create();

    

    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{

        // 并行执行的线程一

    });

    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{

        // 并行执行的线程二

    });

    dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{

        // 汇总结果 

    });

}

 

-(void)yyyyssss{

    UIProgressView *progress = [[UIProgressView alloc] initWithFrame:CGRectMake(10, 50, 200, 10)];

    

    [self.view addSubview:progress];

    

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

       

        for (int i = 0; i <100; i++) {

        //注意:不要在子子线程中更新UI

            

            dispatch_async(dispatch_get_main_queue(), ^{

                progress.progress +=0.1;

            });

            

//            线程休眠

            [NSThread sleepForTimeInterval:0.1];

            

        }

 

        

        

    });

    NSLog(@"下载完成");

    

}

 

-(void)yyyysssscccc{

    

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (ino64_t)(5 *NSEC_PER_SEC)), dispatch_get_main_queue(),^{

        NSLog(@"我是一只消息爱心哦翱翔啊");

    });

    

//    代码只执行一次

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        NSLog(@"这句话我只说一次");

    });

    

    

}

 

posted @ 2015-10-28 10:37  写代码的小书童  阅读(124)  评论(0编辑  收藏  举报