- 每一个线程内部都有一个消息循环,消息循环一接收消息就会创建自动释放池
- 只有主线程的消息循环是开启的,子线程的消息循环默认不开启的,因为UI界面,子线程可能只是一个方法
- 没有事情发生会让程序进入休眠状态,例如黑屏
- 消息循环接受输入源和定时源,点击屏幕算是输入源
- [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
- 消息循环也是要在一定的模式下才能运行的只有当消息循环的运行模式和定时源模式相匹配才能正常执行
- 第五个 添加上去之后再加上滚动字幕就会只能滚动而不能打印定时器内容
所以用NSRunLoopCommonModes这个模式组就可以了
- [NSRunLoop currentRunLoop].currentMode
- kCFRunLoopDefaultMode 默认
UITrackingRunLoopMode追踪模式 专门为滚动视图设计的
- 自定义的方法的属性和类名,千万不要跟系统的一样
- [NSRunLoop currentRunLoop] run]; 死循环 他后面的东西就不会执行
[NSRunLoop currentRunLoop] runUntilDate:[];执行完毕后面东西就会执行
- GCD会充分利用多核 自动管理线程生命周期创建调度销毁 只需要告诉做什么事情
- 任务:执行什么操作 队列用来存放任务 将任务添加到队列
- block当参数传参
- (void)callDemo:(void(^)())block{};调用block
- 串行队列的特点让任务一个一个的执行
同步方式在当前线程依次执行
异步新开线程在新线程中执行任务
- SERIAL串行
dispatch_queue_t = dispatch_queue_create("zc", DISPATCH_QUEUE_SERIAL);
void (^task)() = ^{
NSLog();
}
dispatch_sync (queue, task); 添加队列
- 串行队列 +同步任务 main顺序执行
串行队列 +异步任务 2 顺序执行
DISPATCH_QUEUE_CONCURRENT并发队列 同时调度有序的任务
并发队列 +同步任务 顺序执行 阻塞其他的任务main
并发队列 +异步任务 无序执行 开多个线程
- 线程的开启是看内部有没有空闲的线程然后再次开辟线程 前提是异步
- 同步只在当前线程中执行
- 主队列 主队列的任务只有主线程空闲的时候才会被调度
主队列在程序一运行就开始的不需要创建只需要get
主队列中的任务一定是要在主线程执行的
- dispatch_queue_t queue = dispatch_get_main_queue(); 获取主队列
async 还是在主线程执行 顺序执行 等待大括号执行完才能执行block
sync 会发生死锁 同步任务和主队列相互等待
- 全局队列本质是并发队列
dispatch_queue_t global_queue = dispatch_get_global_queue(0,0);
第二个参数是预留参数 提供以后用
第一个参数ios7及以前代表队列的优先级ios8.0及以后代表服务质量 为了适配传入0
让系统自己判断 凡是涉及到优先级让系统判断
- 同步可以建立依赖关系 一步一步的 就像在官网买软件
- GCD高级功能 一次性执行 延迟操作 调度组
- 一次性操作的关键在于staticdispatch_once_t onceToken ; 一开始为0 然后为-1;
- 单利-- 有且只有一个副本 生命周期跟应用程序是一样的只有一个实例化对象
对象要保存到静态区
- dispatch_time_t when 延迟的时间精确到纳秒
dispatch_queue_t queue队列
dispatch_block_t block 任务
延迟多少纳秒 在哪个队列中执行那个任务
- cell的高度根据下载的图片固定 所以需要调度组
- dispatch_group_t group = dispatch_group_creat;
监听 dispatch_group_notify(group,queue(需要回到主线程要回去getmain), ^{});
- 看底层点man + dispatch_group_notify 会出现最底层的
- NSOperation是一个抽象类 不能直接实用 有定义无实现。
约束子类共有的属性和方法
- 父类指针可以指向子类对象
- NSInvocationOperation操作默认是异步的 队列默认是并发的
- NSBlockOperation 默认是异步的并发
- 实用NSOperation 第一步要创建全局并发队列
- [self.que addOperationWithBlock:^{};
- [NSOperationQueue mainQueue] add ---- 主队列
- 组队列只能用异步
static NSInteger a;
a++;
NSLog(@"%zd", a);
- start是在当前线程
18.GCD
最新推荐文章于 2020-07-20 20:36:44 发布