`
wx1568847608
  • 浏览: 13723 次
文章分类
社区版块
存档分类
最新评论

GCD队列

 
阅读更多

//

//  ViewController.m

//  07-GCD队列

//

//  Created by Jarvan on 16/7/26.

//  Copyright © 2016年 Jarvan. All rights reserved.

//锁的概念:同一时间只允许一个线程访问一段数据

 

#import "ViewController.h"

 

@interface ViewController ()

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}

 

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    /** 

     - 同步和异步主要影响:具不具备开启新的线程 (并不代表一定会开线程!);

     - 并行和串行主要影响:任务的执行方式;

     

     dispatch_async: 异步

     dispatch_sync: 同步

     

     1、异步 + 并发队列   (经常使用)

     2、异步 + 串行队列

     

     3、同步 + 并发队列

     4、同步 + 串行队列

     

     5、异步 + 主队列 (线程间通信)

     6、同步 + 主队列 (面试,不能用)

     */

 

    // 1、异步 + 并发队列

//    [self asyncGlobalQueue];

    

    // 2、异步 + 串行队列

//    [self asyncSerialQueue];

    

    // 3、同步 + 并发队列

//    [self syncGlobalQueue];

    

    // 4、同步 + 串行队列

//    [self syncSerialQueue];

    

    // 5、异步 + 主队列 (线程间通信)

//    [self asyncMainQueue];

    

    // 6、同步 + 主队列

    [self syncMainQueue];

}

 

/** 

 6、同步 + 主队列

 

 syncMainQueue方法(任务1 + 任务2 + 任务3 + 任务4)

 任务1

 任务2

 任务3

 任务4

 */

- (void)syncMainQueue{

    NSLog(@"-----------");

    

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"1-%@",[NSThread currentThread]);

    });

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"2-%@",[NSThread currentThread]);

    });

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"3-%@",[NSThread currentThread]);

    });

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"4-%@",[NSThread currentThread]);

    });

    

    NSLog(@"+++++++++");

}

 

 

/** 

 5、异步 + 主队列 (线程间通信)

 会不会开启线程: 不会开启线程 (异步是有能力开启,但不一定开启)

 主队列: 一个一个执行

 

 备注: 主队列中,必须是异步!!!!

 */

- (void)asyncMainQueue{

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"1-%@",[NSThread currentThread]);

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"2-%@",[NSThread currentThread]);

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"3-%@",[NSThread currentThread]);

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"4-%@",[NSThread currentThread]);

    });

}

 

 

/** 

 4、同步 + 串行队列

 会不会开启线程: 不会开启线程 (主线程中执行)

 执行方式: 一个一个执行

 */

- (void)syncSerialQueue{

    // 1、串行队列

    dispatch_queue_t queue = dispatch_queue_create("syncSerialQueue", NULL);

    

    // 2、添加任务

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

}

 

/** 

 3、同步 + 并发队列

 会不会开启线程: 不会开启线程(主线程中执行)

 执行方式: 因为不能开启线程,所以只能在一个线程中执行,即只能是一个一个执行

 */

- (void)syncGlobalQueue{

    // 1、全局队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    

    // 2、添加任务

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

}

 

/** 

 2、异步 + 串行队列

 会不会开启线程: 会开启线程

 执行方式: 一个一个任务执行

 */

- (void)asyncSerialQueue{

    // 1、获取串行队列

    // label: 队列标识

    dispatch_queue_t queue = dispatch_queue_create("asyncSerialQueue", NULL);

    

    // 2、添加任务

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

}

 

/** 

 1、异步 + 并发队列

 会不会开启线程: 会开启线程

 执行方式: 多个任务同时执行

 */

- (void)asyncGlobalQueue{

    // 1、并发队列(全局队列)

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    

    // 2、添加任务

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载1",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载2",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载3",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载4",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"%@ >> 下载5",[NSThread currentThread]);

    });

}

 

@end

转载于:https://my.oschina.net/u/3389486/blog/868491

分享到:
评论

相关推荐

    GCD 总结-队列和任务的理解

    GCD的核心概念包括队列和任务,本篇文章将深入探讨这两种核心元素,以及如何在实际项目中运用它们。 ### 1. GCD 的基本概念 GCD 是基于 C 语言的,但在 Objective-C 和 Swift 中都可以使用。它是Apple的系统级并发...

    GCD线程基础学习资源

    二、创建和使用GCD队列 1. 主队列:默认的串行队列,所有在主队列上的任务都会在主线程上执行,确保UI更新同步。 2. 自定义串行队列:使用`dispatch_queue_create()`函数创建,适用于需要按顺序执行的任务。 3. 并行...

    GCD多线程_demo

    6. 创建和使用GCD队列 使用`dispatch_queue_create()`函数可以创建自定义的队列,然后通过`dispatch_async()`或`dispatch_sync()`函数将任务添加到队列中。对于系统提供的队列,有主队列(main queue)和全局并行...

    ios-GCDTimer.zip

    6. **GCD队列选择**:定时器可以关联到不同的GCD队列。主队列将在主线程上执行,而全局队列或自定义队列则可在后台线程执行。根据任务的性质选择合适的队列。 7. **异步和同步执行**:使用`dispatch_async()`和`...

    GCDAsynchronousTest2 Demo代码

    - **避免死锁**:当多个GCD队列相互等待时,可能会发生死锁,确保正确地管理和同步队列。 - **资源释放**:在异步操作完成后,记得释放不再使用的资源,防止内存泄漏。 - **队列优先级**:GCD还支持设置队列...

    GCDSingleTest Demo代码

    你可能会看到如何在不同场景下创建并使用GCD队列,以及如何结合单例模式来维护全局状态或服务。通过运行和分析这个Demo,你可以深入理解GCD和单例模式在iOS开发中的应用,从而提升代码的可维护性和性能。 总的来说...

    swift-iOS多线程详细Demo

    - NSOperationQueue则负责调度这些操作,类似GCD队列。 - NSOperation有更丰富的属性和方法,如设置依赖、优先级、最大并发数等。 6.async/await - Swift 5.5引入的新特性,简化异步编程模型。 - 使用async函数...

    iOS 线程资料汇总

    在实际开发中,应避免无谓的线程创建,合理使用线程池和GCD队列。同时,避免长时间占用主线程,确保UI的流畅。合理安排任务优先级,减少线程间的竞争,可以提高整体性能。 总之,理解并掌握iOS线程的使用和管理是...

    ios-LHDB.zip

    LHDataBaseOperation 这个类是对前面那个类的封装,所有数据库操作作为block返回 方便LHDBQueue将block加入GCD队列 LHDBQueue 这个类就是在串行队列中执行数据库操作,所有数据库操作都要将操作加入到queue中 ,...

    DispatchGroup合并图片

    同时,合理选择GCD队列类型(串行队列或并发队列)也是提高性能的关键。 9. **错误处理** 在加载图片或合并过程中可能出现错误,如网络错误、文件不存在等。因此,每个图片加载任务应包含适当的错误处理机制,确保...

    OC-dispatch-semaphore

    `dispatch_semaphore`还可以与GCD队列结合使用,实现更复杂的同步策略。例如,可以将信号量与串行队列配合,确保同一时间只有一个任务在处理: ```objc dispatch_queue_t serialQueue = dispatch_queue_create(...

    iphone多线程编程

    3. NSOperation和NSOperationQueue:面向对象的多线程解决方案,提供了更多的控制选项,如依赖关系、取消操作等,同时也支持GCD队列。 线程同步与互斥: 1. @synchronized:Objective-C中的同步关键字,用于保护...

    iOS开发你需要知道的

    2. GCD队列创建:讲解如何使用dispatch_queue_create创建GCD队列。 3. RunLoop:深入理解RunLoop的工作原理及其在iOS中的应用。 十四、其他 1. Cordova跨平台方案:介绍如何使用Cordova构建跨平台iOS应用。 2. ...

    IOS线程学习文档+实例代码,特别适合新手学习,超好

    2. 控制并发数量:合理设置GCD队列的并发数,防止过多线程导致资源浪费。 3. 使用轻量级操作:如GCD的`asyncAfter`、`asyncOnce`等。 通过以上的学习,你可以掌握iOS线程的基本概念、创建和管理方法,以及如何在...

    iOS异步加载图片 (需要至少12个字的名称,过分!)

    2. **创建队列**:创建一个`NSOperationQueue`或使用`dispatch_queue_create()`创建GCD队列。 3. **下载图片**:在队列中添加操作或使用`dispatch_async()`启动异步任务,下载图片。可以使用`NSURLSession`或`...

    gcdtest1示例源码

    在“gcdtest1示例源码”中,我们很可能会看到如何利用GCD实现一个串行队列来执行预加载操作。 串行队列(Serial Queue)是GCD中的一个关键概念。它确保了队列中的任务按照添加的顺序逐一执行,同一时间只有一个任务...

    iOS 延迟加载

    但同样需要注意,如果在延迟时间到达前对象被释放,GCD队列中的任务可能不会执行。 4. **RunLoop** 除了以上方法,还可以利用RunLoop的特性实现延迟加载。RunLoop是iOS应用中的一个关键组件,负责处理事件并控制...

    iOS GCD多核编程

    当向并发队列提交任务时,GCD会根据系统资源动态调整任务的执行,可能在一个核心上执行,也可能在多个核心上并发执行,这取决于任务的数量和系统的负载。 三、异步执行任务 在GCD中,可以使用`dispatch_async`函数...

Global site tag (gtag.js) - Google Analytics