细说苹果的多线程处理-GCD

2017-12-26  本文已影响0人  iOS小吴

细说苹果的多线程处理-GCD

GCD的工作原理:让程序平行排队的特定任务,根据看用的资源处理,安排他们在任何可用的处理器核心上执行任务。

GCD的FIFO队列称为dispatch queue (分为三中)

Serial(private dispatch queues) :只执行一个任务,Serial queue通常用于同步访问特定的资源或数据,当你创建多个Serial queue的时候,虽然他们是各自同步执行的,但Serial queue与Serial queue之间是并发执行的。

Concurrent:(global dispatch queue)

可以并发的执行多个任务,但是执行完成的顺序是随机的。

Main dispatch queue :它是全局可用的serial queue,它是在应用程序主线程上执行任务的。

1:  dispatch_async为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 耗时的操作

    dispatch_async(dispatch_get_main_queue(), ^{

       // 更新界面

    });

});

举个例子:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"]; NSData * data = [[NSData alloc]initWithContentsOfURL:url]; UIImage *image = [[UIImage alloc]initWithData:data];

if (data != nil) {(dispatch_get_main_queue(), ^{

self.imageView.image = image;

   });

} });

2dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{

        [NSThread sleepForTimeInterval:1];

        NSLog(@"group1");

    });

    dispatch_group_async(group, queue, ^{

        [NSThread sleepForTimeInterval:2];

        NSLog(@"group2");

    });

    dispatch_group_async(group, queue, ^{

        [NSThread sleepForTimeInterval:3];

        NSLog(@"group3");

    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        NSLog(@"updateUi");

    });

    dispatch_release(group);

依次打印:group1 -group2- group3 -updateUi

3:dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:2];

        NSLog(@"dispatch_async1");

    });

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:4];

        NSLog(@"dispatch_async2");

    });

    dispatch_barrier_async(queue, ^{

        NSLog(@"dispatch_barrier_async");

        [NSThread sleepForTimeInterval:4];

    });

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:1];

        NSLog(@"dispatch_async3");

    });

依次打印 dispatch_async1-dispatch_async2-dispatch_barrier_async

4:dispatch_apply 

执行某个代码片段N次。

dispatch_apply(5, globalQ, ^(size_t index) {

    // 执行5次

});

上一篇下一篇

猜你喜欢

热点阅读