iOS Swift 自定义导航栏 FLNavigationBar 解决所有问题
文章给你推荐
一、GCD
Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。
GCD会自动利用更多的CPU内核(比如双核、四核)
GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程
二、任务与队列
任务:就是执行操作的意思,换句话说就是你在线程中执行的那段代码。
队列:这里的队列指执行任务的等待队列,即用来存放任务的队列。队列是一种特殊的线性表,采用 FIFO(先进先出)的原则,即新任务总是被插入到队列的末尾,而读取任务的时候总是从队列的头部开始读取。每读取一个任务,则从队列中释放一个任务。队列的结构可参考下图:
三、关于同步、异步、并发、串行
同步和异步决定了要不要开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
并发和串行决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
延伸:
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
四、串行队列
系统提供了两种方式
(1) 使用dispatch_queue_create 创建队列
// 队列名称 队列的属性一般为NULL
dispatch_queue_create(const char * _Nullable label, dispatch_queue_attr_t _Nullable attr)
(2) 使用主队列(跟主线程相关联的队列)
使用dispatch_get_main_queue()获得主队列
五、并行队列
GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建
使用dispatch_get_global_queue函数获得全局的并发队列
dispatch_get_global_queue(dispatch_queue_priority_tpriority,unsigned long flags); // 此参数暂时无用,用0即可
示例:
这个参数是留给以后用的,暂时用不上,传个0。
第一个参数为优先级,这里选择默认的。获取一个全局的默认优先级的并发队列。dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列
说明:全局并发队列的优先级
#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 // 后台
六、示例代码
/// 主队列异步 不开辟线程顺序执行
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"主队列异步 ~~~~~1 thread %@",[NSThreadcurrentThread]);
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"主队列异步 ~~~~~2 thread %@",[NSThreadcurrentThread]);
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"主队列异步 ~~~~~3 thread %@",[NSThreadcurrentThread]);
});
/**
主队列异步 ~~~~~1 thread {number = 1, name = main}
主队列异步 ~~~~~2 thread {number = 1, name = main}
主队列异步 ~~~~~3 thread {number = 1, name = main}
*/
// 串行队列
dispatch_queue_tserialQueue =dispatch_queue_create("serial",NULL);
// 串行队列同步执行 不开辟线程
dispatch_sync(serialQueue, ^{
NSLog(@"串行队列同步执行~~~~1 thread %@",[NSThreadcurrentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"串行队列同步执行~~~~2 thread %@",[NSThreadcurrentThread]);
});
dispatch_sync(serialQueue, ^{
NSLog(@"串行队列同步执行~~~~3 thread %@",[NSThreadcurrentThread]);
});
/**
串行队列同步执行~~~~1 thread {number = 1, name = main}
串行队列同步执行~~~~2 thread {number = 1, name = main}
串行队列同步执行~~~~3 thread {number = 1, name = main}
*/
// 串行队列异步执行 开辟一个线程
dispatch_async(serialQueue, ^{
NSLog(@"串行队列异步执行~~~~1 thread %@",[NSThreadcurrentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"串行队列异步执行~~~~2 thread %@",[NSThreadcurrentThread]);
});
dispatch_async(serialQueue, ^{
NSLog(@"串行队列异步执行~~~~3 thread %@",[NSThreadcurrentThread]);
});
/**
串行队列异步执行~~~~1 thread {number = 4, name = (null)}
串行队列异步执行~~~~2 thread {number = 4, name = (null)}
串行队列异步执行~~~~3 thread {number = 4, name = (null)}
*/
// 并行队列
dispatch_queue_tconcurrentQueue =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
// 并行队列同步执行 不开辟线程
dispatch_sync(concurrentQueue, ^{
NSLog(@"并行队列同步执行~~~~1 thread %@",[NSThreadcurrentThread]);
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"并行队列同步执行~~~~2 thread %@",[NSThreadcurrentThread]);
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"并行队列同步执行~~~~3 thread %@",[NSThreadcurrentThread]);
});
/**
并行队列同步执行~~~~1 thread {number = 1, name = main}
并行队列同步执行~~~~2 thread {number = 1, name = main}
并行队列同步执行~~~~3 thread {number = 1, name = main}
*/
// 串行队列异步执行 开辟多个线程
dispatch_async(concurrentQueue, ^{
NSLog(@"并行队列异步执行~~~~1 thread %@",[NSThreadcurrentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"并行队列异步执行~~~~2 thread %@",[NSThreadcurrentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"并行队列异步执行~~~~3 thread %@",[NSThreadcurrentThread]);
});
/**
并行队列异步执行~~~~1 thread {number = 3, name = (null)}
并行队列异步执行~~~~3 thread {number = 6, name = (null)}
并行队列异步执行~~~~2 thread {number = 5, name = (null)}
*/