iOS中的多线程(四)

/ 0评 / 0

一、 GCD简介

GCD是 grand central dispatch 的英文缩写,意为强大的中央调度,GCD是系统底层的一种使用多线程的一种方式,执行效率更高。
首先来了解一些概念:
1.同步与异步 是相对于另外一个任务来说的。
同步
指的是当在执行第一个任务的时候,必须等第一个任务完全执行完之后,再开始第二个任务,不具备开启新线程的能力,这个很耗时间,所以尽量少用同步。

线程与进程4

异步
指的是当第一个任务一开始执行,不管是否执行完,就立刻开始第二个任务,具备开启新线程的能力。

线程与进程5

2.串行与并发 是相对于多个任务来说的。
串行
指多个任务按照一定的顺序,一个执行完之后 执行下一个。

线程与进程6

并发
指多个任务同时执行。

线程与进程7

二、GCD中常用的函数

1. 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
2. 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
3. 使用dispatch_queue_create函数创建串行队列 dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // 队列名称, 队列属性,一般用NULL即可

dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr); // 创建
dispatch_release(queue); // 非ARC需要释放手动创建的队列

4. 使用dispatch_get_main_queue()获得主队列 dispatch_queue_t queue = dispatch_get_main_queue();

5. 使用dispatch_get_global_queue函数获得全局的并发队列 dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags); // 此参数暂时无用,用0即可

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列

全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台

6. //延时两秒
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒后异步执行这里的代码...
});
//iOS中另一种常用的延时操作 [self performSelector:@selector(run) withObject:nil afterDelay:2.0];

7. //单例类的时候常用,这个是只执行一次的代码
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});

8. //创建一个队列组 dispatch_group_t group = dispatch_group_create();
首先:分别异步执行2个耗时的操作
其次:等2个异步操作都执行完毕后,再回到主线程执行操作
如果想要快速高效地实现上述需求,可以考虑用队列
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});

三、示例代码

    // 1,创建串行  或者  并发 队列
    /*
    dispatch_queue_t queue1 = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue1, ^{
                       NSLog(@"1111111111   %d",[NSThread isMainThread]);
                   });
    
    dispatch_async(queue1, ^{
                       NSLog(@"2222222");
                       
                       [NSThread sleepForTimeInterval:2];
                   });
    
    dispatch_async(queue1, ^{
                       NSLog(@"333333333");
                   });
    */
    
    // 2, 获取系统提供的全局并发队列
    /*
    dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(queue2, ^{
        NSLog(@"44444444");
        [NSThread sleepForTimeInterval:2];
    });
    
    dispatch_async(queue2, ^{
        NSLog(@"5555555");
        [NSThread sleepForTimeInterval:2];
    });
    
     
     */
    
    
    
    // 3,获取到系统内部的主线程队列
    
    /*
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    dispatch_async(mainQueue, ^{
        NSLog(@"6666666666  %d",[NSThread isMainThread]);
    });
    
    */
    
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    [self.view addSubview:imageView];
    [imageView release];
   

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://h.hiphotos.baidu.com/image/pic/item/8601a18b87d6277f017b73322b381f30e924fc4b.jpg"]];
        //回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = [UIImage imageWithData:data];
        });
    });

评论已关闭。