//
// 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
相关推荐
GCD的核心概念包括队列和任务,本篇文章将深入探讨这两种核心元素,以及如何在实际项目中运用它们。 ### 1. GCD 的基本概念 GCD 是基于 C 语言的,但在 Objective-C 和 Swift 中都可以使用。它是Apple的系统级并发...
二、创建和使用GCD队列 1. 主队列:默认的串行队列,所有在主队列上的任务都会在主线程上执行,确保UI更新同步。 2. 自定义串行队列:使用`dispatch_queue_create()`函数创建,适用于需要按顺序执行的任务。 3. 并行...
6. 创建和使用GCD队列 使用`dispatch_queue_create()`函数可以创建自定义的队列,然后通过`dispatch_async()`或`dispatch_sync()`函数将任务添加到队列中。对于系统提供的队列,有主队列(main queue)和全局并行...
6. **GCD队列选择**:定时器可以关联到不同的GCD队列。主队列将在主线程上执行,而全局队列或自定义队列则可在后台线程执行。根据任务的性质选择合适的队列。 7. **异步和同步执行**:使用`dispatch_async()`和`...
- **避免死锁**:当多个GCD队列相互等待时,可能会发生死锁,确保正确地管理和同步队列。 - **资源释放**:在异步操作完成后,记得释放不再使用的资源,防止内存泄漏。 - **队列优先级**:GCD还支持设置队列...
你可能会看到如何在不同场景下创建并使用GCD队列,以及如何结合单例模式来维护全局状态或服务。通过运行和分析这个Demo,你可以深入理解GCD和单例模式在iOS开发中的应用,从而提升代码的可维护性和性能。 总的来说...
- NSOperationQueue则负责调度这些操作,类似GCD队列。 - NSOperation有更丰富的属性和方法,如设置依赖、优先级、最大并发数等。 6.async/await - Swift 5.5引入的新特性,简化异步编程模型。 - 使用async函数...
在实际开发中,应避免无谓的线程创建,合理使用线程池和GCD队列。同时,避免长时间占用主线程,确保UI的流畅。合理安排任务优先级,减少线程间的竞争,可以提高整体性能。 总之,理解并掌握iOS线程的使用和管理是...
LHDataBaseOperation 这个类是对前面那个类的封装,所有数据库操作作为block返回 方便LHDBQueue将block加入GCD队列 LHDBQueue 这个类就是在串行队列中执行数据库操作,所有数据库操作都要将操作加入到queue中 ,...
同时,合理选择GCD队列类型(串行队列或并发队列)也是提高性能的关键。 9. **错误处理** 在加载图片或合并过程中可能出现错误,如网络错误、文件不存在等。因此,每个图片加载任务应包含适当的错误处理机制,确保...
`dispatch_semaphore`还可以与GCD队列结合使用,实现更复杂的同步策略。例如,可以将信号量与串行队列配合,确保同一时间只有一个任务在处理: ```objc dispatch_queue_t serialQueue = dispatch_queue_create(...
3. NSOperation和NSOperationQueue:面向对象的多线程解决方案,提供了更多的控制选项,如依赖关系、取消操作等,同时也支持GCD队列。 线程同步与互斥: 1. @synchronized:Objective-C中的同步关键字,用于保护...
2. GCD队列创建:讲解如何使用dispatch_queue_create创建GCD队列。 3. RunLoop:深入理解RunLoop的工作原理及其在iOS中的应用。 十四、其他 1. Cordova跨平台方案:介绍如何使用Cordova构建跨平台iOS应用。 2. ...
2. 控制并发数量:合理设置GCD队列的并发数,防止过多线程导致资源浪费。 3. 使用轻量级操作:如GCD的`asyncAfter`、`asyncOnce`等。 通过以上的学习,你可以掌握iOS线程的基本概念、创建和管理方法,以及如何在...
2. **创建队列**:创建一个`NSOperationQueue`或使用`dispatch_queue_create()`创建GCD队列。 3. **下载图片**:在队列中添加操作或使用`dispatch_async()`启动异步任务,下载图片。可以使用`NSURLSession`或`...
在“gcdtest1示例源码”中,我们很可能会看到如何利用GCD实现一个串行队列来执行预加载操作。 串行队列(Serial Queue)是GCD中的一个关键概念。它确保了队列中的任务按照添加的顺序逐一执行,同一时间只有一个任务...
但同样需要注意,如果在延迟时间到达前对象被释放,GCD队列中的任务可能不会执行。 4. **RunLoop** 除了以上方法,还可以利用RunLoop的特性实现延迟加载。RunLoop是iOS应用中的一个关键组件,负责处理事件并控制...
当向并发队列提交任务时,GCD会根据系统资源动态调整任务的执行,可能在一个核心上执行,也可能在多个核心上并发执行,这取决于任务的数量和系统的负载。 三、异步执行任务 在GCD中,可以使用`dispatch_async`函数...