iOS多线程:GCD源码分析<五>dispatch-source五>
发表于
|
分类于
iOS多线程
dispatch_source##概述Dispatch Source是BSD系统内核惯有功能kqueue的包装,kqueue是在XNU内核中发生各种事件时,在应用程序编程方执行处理的技术。它的CPU负荷非常小,尽量不占用资源。当事件发生时,Dispatch Source会在指定的Dispatch Queue中执行事件的处理。
使用dispatch_source 最常见的用途是实现定时器,GCD timer不依赖runloop,因此任何线程都可以使用,由于使用block,不会忘记避免循环引用,定时器可以自由控制精度,随时修改时间间隔等。123456dispatch_source_t timer
...
iOS多线程:GCD源码分析<四>-dispatch_semaphore四>
发表于
|
分类于
iOS多线程
dispatch_semaphore概述dispatch_semaphore是持有计数的信号,该信号是多线程编程中的计数类型信号。有3个api:create, wait signal。
使用
对常用资源进行加锁操作,防止多线程访问修改数据导致出现结果不一致甚至崩溃的问题:
123456//在init等函数初始化_lock = dispatch_semaphore_create(1); dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); //修改Array或字典等数据的信息dispatch_semaphore_signal(_lock)
...
iOS多线程:GCD源码分析<三>dispatch_once三>
发表于
|
分类于
iOS多线程
dispatch_once概述dispatch_once能保证任务只会被执行一次,即使同时多线程调用也是线程安全的。常用于创建单例、swizzeld method等功能。
使用1234static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{ //创建单例、method swizzled或其他任务});
源码分析1234//调用dispatch_once_f来处理void dispatch_once(dispatch_once_t *val, dispatch_block_t block)
...
iOS多线程:GCD源码分析<二> dispatch_group二>
发表于
|
分类于
iOS多线程
dispatch_group转载于深入浅出 GCD 之 dispatch_group
概述dispatch_group可以将GCD任务合并到一个组管理,也可以同时监听组内所有任务的执行情况。主要的API有以下几个,先看一下Dispatch Group的具体使用。
dispatch_group_create
dispatch_group_enter
dispatch_group_leave
dispatch_group_wait
dispatch_group_notify
dispatch_group_async
使用123456789101112131415161718dispatch_g
...
iOS 多线程:GCD源码分析<一>一>
发表于
|
分类于
iOS多线程
GCD前言在日常开发中,GCD是我们常用的多线程开发工具,它隔离了我们与线程间的直接交互,所以在使用过程中我们很少关注到GCD的底层原理。此次带着几个问题来对GCD源码进行分析。源码版本339.92.1。
dispatch_async 如何实现的,分发到主队与全局队列有什么区别,一定会新建线程执行任务么?
dispatch_sync 如何实现的,为什么说 GCD 死锁是队列导致的而不是线程,死锁不是操作系统的概念么?
信号量是如何实现的,有哪些使用场景?
dispatch_group 的等待与通知。
dispatch_once 如何实现?
dispatch_source 用来做定时器如何实现
...
iOS 多线程:锁
发表于
|
分类于
iOS多线程
本文主要介绍iOS中常用锁的相关知识及用法,大部分概念来自于线程同步及线程锁。
原子操作问:在OC中对属性变量添加atomic修饰符,能使属性线程安全吗?
原子操作,即不可分割开的操作;该操作一定是在同一个cpu时间片中完成,这样即使线程被切换,多个线程也不会看到同一块内存中不完整的数据。
原子表示不可分割的最小单元,具体来说是指在所处尺度空间或者层(layer)中不能观测到更为具体的内部实现与结构。对于计算机程序执行的最小单位是单条指令。我们可以通过参考各种cpu的指令操作手册,用其汇编指令编写原子操作。而这种方式太过于低效。
某些简单的表达式可以算作现代编程语言的最小执行单元,某些简单的表
...
NSTimer解决循环引用的几种方式
发表于
|
分类于
iOS
NSTimerNSTimer是日常常用控件,但在使用中需要注意避免循环引用的问题。NSTimer使用方式如下12345678- (void)initTimer { self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(beginTimer) userInfo:nil repeats:YES]; }- (void)dealloc { [self.timer invalidate]; self.timer = nil;}
由
...
vue双向绑定实现原理
发表于
|
分类于
web
Vue.js 双向绑定实现原理1、编译代码,将代码中的特殊模板替换成vue属性值,模板得到初始化。利用DocumentFragment存储dom,完成遍历后一次性添加到原始dom中,只发生1次渲染操作,提高性能。
2、例如input控件text发生变化时需要同步修改data中对应的属性,所以监听input控件的输入事件,如有变化就调用data中属性的set方法,实现属性值更新。为属性添加get、set方法需要使用Object.defineProperty() 覆盖原始属性的实现。这一步骤即为响应式数据绑定
3、如何让文本节点实时变化? 利用订阅发布模式,通知文本节点属性变化。将每一个属性添加
...