GCD常用用法

来源:互联网 发布:赖昌星 红楼 知乎 编辑:程序博客网 时间:2024/04/30 09:59

/** * 2)并行队列global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。  3)串行队列serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。  当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。  */@implementation ViewController- (void)viewDidLoad {    [superviewDidLoad];        //    [self backThread];//    [self mainThead];//    //    [self singleObj];//    [self singleObj];        //    [self afterTime];//    [self mainThead];    //      [self asyncGroup];          [selfasyncGroupMain];}// 后台执行 ---另开了一条线程处理- (void)backThread{    dispatch_async(dispatch_get_global_queue(0,0), ^{                for (int i =0; i<20; i++) {            NSLog(@"backThread is name --- >%@",[NSThreadcurrentThread].description);        }    });}// 主线程执行--------在需要回到主线程的地方直接调用此方法。- (void)mainThead{   dispatch_async(dispatch_get_main_queue(), ^{              for (int i =0;  i<20; i++) {           NSLog(@"mainThead is name --- > %@", [NSThreadcurrentThread].description);       }          });}// 这个代码只会执行一次,常用于单利模式。- (void)singleObj{   static  dispatch_once_t onceToken;   dispatch_once(&onceToken, ^{              NSLog(@"这里面的代码只会执行一次");          });    }// 延迟时间执行----调用这个方法并不会延迟主线程。其他的主线程的方法还是照样执行, 只是,后面的几秒钟后// 这个主线程的方法在回来执行,相当于一个回调。 并不会阻止其他的方法调用。- (void)afterTime{  dispatch_time_t  time = dispatch_time(DISPATCH_TIME_NOW,4.0*NSEC_PER_SEC);      dispatch_after(time,dispatch_get_main_queue(), ^{           NSLog(@"等了4秒了,开始执行了......");       NSLog(@"mainThead is name --- > %@", [NSThreadcurrentThread].description);        });    }// 并行线程组,  如果需要和主线程交互的话, 直接交互就好。- (void)asyncGroup{    dispatch_group_t group =dispatch_group_create();    dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{                for (int i =0; i<200; i++) {            NSLog(@"我是线程一号");        }            });    dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{                for (int i =0; i<200; i++) {            NSLog(@"我是线程二号");        }            });    dispatch_group_notify(group,dispatch_get_global_queue(0,0), ^{                NSLog(@"等待异步线程全部执行完后,我这里的总结----这里还是异步线程中,不在主线程");        NSLog(@"thread is -->%@",[NSThreadcurrentThread].description);                // 和主线程通信        dispatch_async(dispatch_get_main_queue(), ^{                        self.view.backgroundColor = [UIColororangeColor];             NSLog(@"thread is -->%@",[NSThreadcurrentThread].description);                    });                    });}// 主线程处理。-----------异步和同步的处理的关键就是在于 dispatch_get_main_queue和 dispatch_get_global_queue//                      的区别。 这里是主线程的第一个任务处理完了,那么后面的在执行。 这种方式也可以处理不会让公共//                      资源的混乱的处理。- (void)asyncGroupMain{        // 自定义 串行队列    dispatch_queue_t  serialqueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);    // 自定义 并行队列    dispatch_queue_t  concurrentqueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);        // 自定义队列,在这里也就决定了, 你是用异步处理还是同步处理问题。        dispatch_group_t  group =dispatch_group_create();        dispatch_group_async(group,dispatch_get_main_queue(), ^{        for (int i =0 ; i<20; i++) {            NSLog(@"1号在执行");        }    });            dispatch_group_async(group,dispatch_get_main_queue(), ^{        for (int i =0; i < 20; i++) {            NSLog(@"2号在执行");        }    });        dispatch_group_notify(group,dispatch_get_main_queue(), ^{                NSLog(@"我是最后执行的.....");            });}


0 0
原创粉丝点击