• 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(@"这句话我只说一次");

        });

        

        

    }

  • 相关阅读:
    spring 的简单了解
    leetcode 刷题锻炼算法思维
    REDIS学习笔记
    mark:如何使用FileZilla连接虚拟机上的Fedora
    尝试在virtualbox fedora21 下安装additions和mount share folder
    字符集与Mysql字符集处理(二)
    字符集与Mysql字符集处理(一)
    MYSQL开发性能研究——INSERT,REPLACE,INSERT-UPDATE性能比较
    MYSQL开发性能研究——批量插入的优化措施
    Marven笔记贴
  • 原文地址:https://www.cnblogs.com/panfeng1104/p/4916576.html
Copyright © 2020-2023  润新知