ios开发:GCD多线程

  ios有三种多线程编程技术,分别是NSThread,Cocoa NSOperation和GCD,GCD全称Grand Central Dispatch 是Apple开发的一个多核编程的解决方法,在iOS4.0开始之后才能使用。GCD是一个可以替代NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,而且其使用起来比前两者更加的简单方便,今天主要给大家介绍一下有关GCD的使用。

  GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。一个任务可以是一个函数或者是一个语句块(block),GCD的依然是用线程实现,不过这样可以让普通开发者不用去关注其实现的细节,GCD中的队列称为dispatch queue。

  Dispatch Queue分为三种:

  1. Serial Dispatch Queue: 线性执行的线程队列,遵循FIFO(First In First Out)原则;

  2. Concurrent Dispatch Queue: 并发执行的线程队列,并发执行的处理数取决于当前状态;

  3. Main Dispatch Queue:在应用程序主线程上执行任务。

先来看几个常用的方法:

 1.dispatch_async

    有的时候避免界面在处理耗时的操作时卡死,比如发起网络请求,下载数据,缓存图片等,我们需要在另外的一个线程中处理这些操作,在这些操作完成后再通知主线程更新界面,看下面一段代码

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //耗时操作
        NSDate* date = [NSDate date];
        NSLog(@"------%@",date);

        NSURL * url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/0823dd54564e9258ca2f34e79e82d158ccbf4e9b.jpg"];
        NSData * data = [[NSData alloc]initWithContentsOfURL:url];
        UIImage *image = [[UIImage alloc]initWithData:data];
        [NSThread sleepForTimeInterval:4];//为了体现多线程的特点 在这里设置一个延时
        if (data != nil) {
            dispatch_async(dispatch_get_main_queue(), ^{
                //结果处理
                UIImageView* imageview = [[UIImageView alloc]initWithImage:image];
                imageview.frame = [UIScreen mainScreen].bounds;
                [self.view addSubview:imageview];
                NSDate* date = [NSDate date];
                NSLog(@"------%@",date);
            });
        }
    });

  我们在一个线程里完成下载图片的动作(为了体现多线程的作用,我们在这里设置一个延时)然后在另一个线程里把图片显示出来,来看一下运行结果。

系统给每个应用都提供的有队列,所以一般不用我们手动的去创建,我们只需要通过函数去获取队列就可以了

// 获取Main Dispatch Queue
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
// 获取Global Dispatch Queue
dispatch_queue_t globalDispatchQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

 2、dispatch_group_async

  dispatch_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(@"线程1");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"线程2");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"线程3");
    });  //dispatch_group_notify函数用来指定一个额外的block,该block将在group中所有任务完成后执行
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"更新操作");
    });

由结果可以看出,3个线程都执行完成后,更新操作才执行

 3、dispatch_barrier_async

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

dispatch_queue_t queue = dispatch_queue_create("gcdtest2", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"线程1");
    });
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"线程2");
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"barrier执行");
        [NSThread sleepForTimeInterval:5];
    });
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"线程4");
    });

  

时间: 2024-08-24 20:22:38

ios开发:GCD多线程的相关文章

iOS开发之多线程——GCD介绍

iOS开发之多线程——GCD的介绍 一.简单介绍 1.GCD ( Grand Central Dispatch) 可以翻译为“中枢调度器”.纯C语言,并且提供了非常强大的函数. 2.GCD 有什么优势: GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多地CPU 内核 (比如双核.四核) GCD会自动管理线程的生命周期 (创建线程.调度任务.销毁线程) 程序猿只需要告诉GCD想要执行设呢任务,不需要编写任何线程管理代码. 二.任务和队列 GCD中有两个核心概念 (1)任务: 执

学习IOS开发网络多线程篇--NSThread/GCD/

NSThread:利用NSThread创建和启用一个线程 1. NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];,调用后调用[thread start]; 2. 创建线程后自动启动线程 ,[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 3. 隐式创建

iOS开发之多线程编程

iOS开发之多线程编程 1. 多线程简述 1.1什么是多线程? 解决的问题? 多线程是指,编程中在主线程之外开辟的新线程,用于处理一些耗时的.并发的任务.使用多线程可以避免主线程的阻塞,也对一个线程不容易实现的任务提供了思路.在多线程的知识中也涉及队列,锁等概念. 在这里科普一下队列的概念,队列:是管理线程的,相当于线程池,能管理线程什么时候执行.队列分为串行队列和并行队列. 串行队列:队列中的线程按顺序执行(不会同时执行) 并行队列:队列中的线程会并发执行,可能会有一个疑问,队列不是先进先出吗

IOS开发之多线程 -- GCD的方方面面

前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现给读者,同时也是讲大神博客中有的深涩的理论理解的通熟易懂转述给读者,已经是尽可能的让读者深入理解和掌握多线程的知识以及GCD的使用技术.最后的附录中,我将会给出所有本人阅读的大神写的关于多线程或者是GCD的文章链接,大家感兴趣的,可以去参考和学习.也许,看我的这篇就够了,因为我就是参考他们的,嘻嘻.

IOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

前言:在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间和资源)等等.也就是说,我们可以使用线程把占据时间长的任务放到后台中处理,而不影响到用户的使用. 线程的定义: 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa

iOS开发之多线程技术(NSThread、OperationQueue、GCD)

在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西.其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的,今天就做一个小的demo来详细的了解一下iOS中的多线程的东西.可能下面的东西会比较枯燥,但还是比较实用的. 多线程用的还是比较多的,废话少说了,下面的两张截图是今天我们实验的最终结果,应该是比较全的,小伙伴们由图来分析具体的功能吧: 功能说明: 1.点击同步请求图片,观察整个UI界面的变化,并点

iOS开发中多线程基础

耗时操作演练 代码演练 编写耗时方法 - (void)longOperation { for (int i = 0; i < 10000; ++i) { NSLog(@"%@ %d", [NSThread currentThread], i); } } 直接调用耗时方法 // 1> 直接调用耗时方法 [self longOperation]; 运行測试效果 在后台运行耗时方法 // 2> 在后台运行耗时方法 [self performSelectorInBackgro

iOS开发之多线程技术——NSOperation篇

本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation 1.自定义NSOperation 2.NSOperation的基本使用 3.NSOperation实现线程间通信 1)利用代理进行消息传递 2)利用通知实现消息传递 3)利用block进行消息传递 四.与GCD比较 一.什么是NSOperation NSOperation是一个抽象的基类,表示一个独

iOS开发之多线程篇 多线程简介

iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程的