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;
        }
    }
}
复制代码

 

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

 

 

 

 

 

 

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类:  iOS高级

本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4859089.html,如需转载请自行联系原作者
相关文章
|
11天前
|
安全 Android开发 iOS开发
Android vs. iOS:构建生态差异与技术较量的深度剖析###
本文深入探讨了Android与iOS两大移动操作系统在构建生态系统上的差异,揭示了它们各自的技术优势及面临的挑战。通过对比分析两者的开放性、用户体验、安全性及市场策略,本文旨在揭示这些差异如何塑造了当今智能手机市场的竞争格局,为开发者和用户提供决策参考。 ###
|
7天前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术深度对比
【10月更文挑战第18天】 在智能手机操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两种系统的技术特点、优势以及它们之间的主要差异,帮助读者更好地理解这两个平台的独特之处。
19 0
|
4天前
|
安全 Android开发 iOS开发
iOS与安卓:技术生态的双雄争霸
在当今数字化时代,智能手机操作系统的竞争愈发激烈。iOS和安卓作为两大主流平台,各自拥有独特的技术优势和市场地位。本文将从技术架构、用户体验、安全性以及开发者支持四个方面,深入探讨iOS与安卓之间的差异,并分析它们如何塑造了今天的移动技术生态。无论是追求极致体验的苹果用户,还是享受开放自由的安卓粉丝,了解这两大系统的内在逻辑对于把握未来趋势至关重要。
|
5天前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
9天前
|
安全 Android开发 iOS开发
安卓vs iOS:探索两种操作系统的独特魅力与技术深度###
【10月更文挑战第16天】 本文旨在深入浅出地探讨安卓(Android)与iOS这两种主流移动操作系统的特色、优势及背后的技术理念。通过对比分析,揭示它们各自如何塑造了移动互联网的生态,并为用户提供丰富多彩的智能体验。无论您是科技爱好者还是普通用户,都能从这篇文章中感受到技术创新带来的无限可能。 ###
26 2
|
9天前
|
机器学习/深度学习 人工智能 Android开发
安卓与iOS:技术演进的双城记
【10月更文挑战第16天】 在移动操作系统的世界里,安卓和iOS无疑是两个最重要的玩家。它们各自代表了不同的技术理念和市场策略,塑造了全球数亿用户的移动体验。本文将深入探讨这两个平台的发展历程、技术特点以及它们如何影响了我们的数字生活,旨在为读者提供一个全面而深入的视角,理解这两个操作系统背后的哲学和未来趋势。
24 2
|
15天前
|
Java Android开发 Swift
掌握安卓与iOS应用开发:技术比较与选择指南
在移动应用开发领域,谷歌的安卓和苹果的iOS系统无疑是两大巨头。它们不仅塑造了智能手机市场,还影响了开发者的日常决策。本文深入探讨了安卓与iOS平台的技术差异、开发环境及工具、以及市场表现和用户基础。通过对比分析,旨在为开发者提供实用的指导,帮助他们根据项目需求、预算限制和性能要求,做出最合适的平台选择。无论是追求高度定制的用户体验,还是期望快速进入市场,本文都将为您的开发旅程提供有价值的见解。
|
19天前
|
Java 数据库连接 数据库
不同业务使用同一个线程池发生死锁的技术探讨
【10月更文挑战第6天】在并发编程中,线程池是一种常用的优化手段,用于管理和复用线程资源,减少线程的创建和销毁开销。然而,当多个不同业务场景共用同一个线程池时,可能会引发一系列并发问题,其中死锁就是最为严重的一种。本文将深入探讨不同业务使用同一个线程池发生死锁的原因、影响及解决方案,旨在帮助开发者避免此类陷阱,提升系统的稳定性和可靠性。
38 5
|
26天前
|
物联网 vr&ar Android开发
掌握安卓与iOS应用开发:核心技术与未来趋势
本文深入探讨了安卓和iOS应用开发的核心技术,包括开发环境、主要编程语言、常用框架以及性能优化技巧。同时,文章还展望了两大平台未来的发展趋势,如人工智能、增强现实和物联网的集成,为开发者提供全面的技术参考和发展指引。
|
23天前
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。