iOS:多线程技术GCD的使用

GCD的使用:

1.队列的类型

1.1 主队列:mian queue,主线程队列,负责更行UI的操作。是一个串行的队列。

1.2 系统默认的并行队列:global queue,按优先级分类。

1.3 自定义的队列:可以创建串行队列或者是并行的队列

2.任务

2.1 封装的形式:block方法或C语言的函数

2.2 添加到队列的方式:同步或异步(只对并行队列有区别)

例如服务器请求:

同步:提交请求->等待服务器处理(这个期间客户端浏览器不能干任何事)->处理完毕返回

异步:请求通过事件触发->服务器处理(这个期间客户端浏览器仍可以干其他的事)->处理完毕返回

3.特殊使用

3.1 只执行一次 dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);(多用于单例模式)

3.2 延时执行    dispatch_after(dispatch_time_t when,dispatch_queue_t  queue,dispatch_block_t block);

3.3 成组的执行任务       dispatch_group_create(void);

3.4 创建自定义的队列    dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

3.5 创建默认的全局队列 dispatch_get_global_queue(long identifier, unsigned long flags)

3.6 获取主队列             dispatch_get_main_queue(void)

3.7 异步执行                dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

3.8 同步执行              dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

3.9 多次执行   dispatch_apply(size_t iterations, dispatch_queue_t queue,void (^block)(size_t));

…………………等等…………………

4.几个方法参数解释:

<1>创建自定义的队列    dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

const char *label:队列名字                   dispatch_queue_attr_t attr:队列执行方式(异步、同步)

<2>创建默认的全局队列 dispatch_get_global_queue(long identifier, unsigned long flags)

long identifier:队列执行的优先级           unsigned long flags:默认为0即可

<3>多次执行         dispatch_apply(size_t iterations, dispatch_queue_t queue,void (^block)(size_t));

size_t iterations:执行次数      dispatch_queue_t queue:队列      void (^block)(size_t):block函数块

5.队列方式宏定义(用于创建自定义队列时的参数)

#define DISPATCH_QUEUE_SERIAL NULL         //串行(同步)

#define DISPATCH_QUEUE_CONCURRENT        //并行(异步)

6.队列优先级宏定义(创建全局队列时的参数)

#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

7.更能区分

主队列:专门用来执行主线程的,进行UI的更新操作

全局队列或自定义队列:用来添加并执行其他的线程,进行数据的操作

具体举例如下:

例子1:采用不分组的方式,将多线程添加到队列中,然后进行多线程的操作。

1.准备UI界面布局:拖入一个文本视图控件,并关联相关的类中,同时在类中声明一个票数变量

@interface ViewController ()
{
    NSInteger _tickets;
}
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end

2.设置票数,同时将原来文本视图中默认的数据清空,取消自动布局便于后面添加数据时自动滚动文本视图

 //设置数据和文本视图
 _tickets = 20;
 [self.textView setText:@""];
 self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.创建全局队列,并设置优先级

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

4.用GCD创建任务线程,并将线程添加到队列中,采用异步执行方式

dispatch_async(queue, ^{
        [self GCDSellTicketMethod:@"GCD售票线程-1"];
    });

dispatch_async(queue, ^{
        [self GCDSellTicketMethod:@"GCD售票线程-2"];
    });

5.定义更新UI的方法

#pragma mark -更新UI的操作

-(void)appendTextView:(NSString *)text
{
    //1.获取原来的数据
    NSMutableString *content = [NSMutableString stringWithString:self.textView.text];
    NSRange range = NSMakeRange(content.length, 2);

    //2.追加新的内容
    [content appendString:[NSString stringWithFormat:@"\n%@",text]];
    [self.textView setText:content];

    //3.滚动视图
    [self.textView scrollRangeToVisible:range];
}

6.定义任务线程的执行方法

#pragma mark -执行线程的操作

-(void)GCDSellTicketMethod:(NSString *)name
{
    while (YES)
    {
        if(_tickets > 0)
        {
            //使用GCD
            dispatch_async(dispatch_get_main_queue(), ^{
                //更新UI
                NSString *info = [NSString stringWithFormat:@"总票数:%ld,当前的线程:%@",_tickets,name];
                [self appendTextView:info];

                //卖票
                _tickets--;
            });

            //线程休眠
            if([name isEqualToString:@"GCD售票线程-1"])
            {
                [NSThread sleepForTimeInterval:0.3f];
            }
            else
            {
                [NSThread sleepForTimeInterval:0.2f];
            }
        }
        else
        {
            //使用GCD更新UI
            dispatch_async(dispatch_get_main_queue(), ^{
                NSString *info = [NSString stringWithFormat:@"票已经卖完,当前线程:%@",name];
                [self appendTextView:info];
            });

            //退出线程
            break;
        }
    }
}

例子2:采用分组的方式,将线程组添加到队列中,然后进行多线程的操作。

1.准备UI界面布局:拖入一个文本视图控件,并关联相关的类中,同时在类中声明一个票数变量

@interface ViewController ()
{
    NSInteger _tickets;
}
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end

2.设置票数,同时将原来文本视图中默认的数据清空,取消自动布局便于后面添加数据时自动滚动文本视图

 //设置数据和文本视图
 _tickets = 20;
 [self.textView setText:@""];
 self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.创建一个线程分组

dispatch_group_t group = dispatch_group_create();

4.创建自定义的队列,并设置队列执行方式为并行方式(异步)

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

5.用GCD创建任务线程组,并将线程组添加到队列中,采用分组异步执行方式

dispatch_group_async(group,queue, ^{

[self GCDSellTicketMethod:@"GCD售票线程-1"];

});

dispatch_group_async(group,queue, ^{

[self GCDSellTicketMethod:@"GCD售票线程-2"];

});

6.等线程组中的所有任务完成后,会接收到通知,更新UI

dispatch_group_notify(group, queue, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSString *info = [NSString stringWithFormat:@"票已经卖完"];
            [self appendTextView:info];
        });
    });

7.定义更新UI的方法

#pragma mark -更新UI的操作

-(void)appendTextView:(NSString *)text
{
    //1.获取原来的数据
    NSMutableString *content = [NSMutableString stringWithString:self.textView.text];
    NSRange range = NSMakeRange(content.length, 2);

    //2.追加新的内容
    [content appendString:[NSString stringWithFormat:@"\n%@",text]];
    [self.textView setText:content];

    //3.滚动视图
    [self.textView scrollRangeToVisible:range];
}

8.定义任务线程的执行方法

#pragma mark -执行线程的操作

-(void)GCDSellTicketMethod:(NSString *)name
{
    while (YES)
    {
        if(_tickets > 0)
        {
            //使用GCD
            dispatch_async(dispatch_get_main_queue(), ^{
                //更新UI
                NSString *info = [NSString stringWithFormat:@"总票数:%ld,当前的线程:%@",_tickets,name];
                [self appendTextView:info];

                //卖票
                _tickets--;
            });

            //线程休眠
            if([name isEqualToString:@"GCD售票线程-1"])
            {
                [NSThread sleepForTimeInterval:0.3f];
            }
            else
            {
                [NSThread sleepForTimeInterval:0.2f];
            }
        }
        else
        {
            //退出线程
            break;
        }
    }
}

两种情况的演示结果如下:

时间: 2025-01-11 00:39:30

iOS:多线程技术GCD的使用的相关文章

iOS多线程技术—GCD介绍

iOS多线程技术—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中,

iOS多线程技术—GCD的用法

iOS多线程技术—GCD的用法 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程. 获取主队列的方式: 1 // 2 // YYViewController.m 3 // 12-GCD的基本使用(主队列) 4 // 5 // Created by 孔医己 on 14-6-25. 6 // Copyright (c) 2014

iOS多线程技术---GCD

下面这个链接的GCD讲的很好,做个备忘. 1,将GCD的各种原理,分析的比较透彻: http://www.dreamingwish.com/dream-2012/gcdgrand-central-dispatch%E6%95%99%E7%A8%8B.html 2,唐巧(前网易有道员工),简洁明了的使用示例: http://blog.devtang.com/blog/2012/02/22/use-gcd/

OA01-一个Demo展示iOS多线程技术的基本应用场景

最近在看iOS关于GCD.NSOperation多线程编程技术编程指南的时候写了个 小Demo,以7个小场景基本涵盖多线程技术的主流用法:其实多线程技术早在大学 读书的时候,基本思路就已经清晰了,不同操作系统的多线程实现也大同小异,iOS 平台下原理也是一样,关键就在与,能否熟练的.很顺畅的根据应用场景来选用相应 的多线程技术.阅读苹果官方文档和一些别人写的博客的时候也依然有种隔靴捞痒的 感觉:书读百边,不如实践一遍啊,SO,尽管网上相关的博客一大堆(首推这篇: http://www.cocoa

iOS 多线程技术1

iOS 多线程技术1 iOS 有三种多线程编程技术: NSThread NSOperation GCD 它们的抽象程度由低到高,越高的使用起来越简单. NSThread 显示调用 NSthread 类 类方法 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; 实例方法 - (instancetype)initWithTarget:(id)target selecto

iOS 多线程技术2

iOS 多线程技术2 NSOperation NSInvocationOperation //创建一个队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //创建子任务,定义子任务必须是 NSOperation 的子类 NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosome

iOS多线程技术—线程的状态

iOS多线程技术—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时间

iOS多线程技术—单例模式(ARC)与(MRC)

iOS多线程技术—单例模式(ARC) 一.简单说明: 设计模式:多年软件开发,总结出来的一套经验.方法和工具 java中有23种设计模式,在ios中最常用的是单例模式和代理模式. 二.单例模式说明 (1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源. (2)单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个. (3)单例模式在ARC\MRC环

iOS多线程技术—自定义NSOperation

iOS多线程技术—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. // // YYViewController.h // 01-自定义Operation // // Created by apple on 14-6-26. // Copyright (c) 2014年 itcase. All rights reserved.

iOS多线程技术—NSOperation用法

iOS多线程技术—NSOperation用法 一.NSOperation简介 1.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOperat