iOS中的几种多线程
GCD
1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情况发,会产生循环等待,死锁问题
2、我们一般在主线程中进行UI的刷新,例如,点击、滚动、拖拽等操作
3、使用dispatch_queue_create来创建队列,serial dispatch queue为串行队列,concurrent dispatch queue为并发队列,获取主队列的方式(dispatch_get_main_queue())
4、同步dispatch_sync(不具备开辟线程的能力),异步dispatch_async(具备开辟线程的能力)
5、在任务中添加队列的方式,来进行不同场景或者任务的执行
6、GCD的常用方法:dispatch_barrier_async(这个方法可以用来解决多读单写问题)
GCD 延时执行方法:dispatch_after
GCD 延时执行方法:dispatch_after
GCD 快速迭代方法:dispatch_apply
GCD 队列组:dispatch_group (常搭配dispatch_group_enter、dispatch_group_leave、dispatch_group_notify来使用),其中enter和leave是成对出现的,notify是在所有任务执行完成之后,才会执行的函数,常用场景为,下载多张图片合成为一张图片问题
GCD 信号量:dispatch_semaphore
使用dispatch_semaphore_create初始化并创建一个信号总量,dispatch_semaphore_signal 信号量加1解锁,dispatch_semaphore_wait 信号量减1加锁,因为信号总量在小于0时,便会阻塞线程
通常需要配合dispatch_get_global_queue来使用
NSOperation:
1、通常搭配NSOperationqueue来使用
2、优势:
2.1、可以添加线程之间的依赖,addDependency(添加),removeDependency(移除)
2.2、可以控制执行状态:isready(是否准备完成),isExecuting(是否正在执行),isFinished(是否已经完成),isCanceled(是否已经取消)
2.3、可以控制最大并发数(但是又系统上限,超出则默认为系统的最大数)
2.4、可以通过KVO来移除一个isFinished=YES的NSOperation
3、对状态的控制,可以通过重写来实现
3.1、重写main方法,底层控制任务状态的完成状态以及任务的退出
3.2、重写start方法,自行控制任务状态,需要自己去写任务状态的改变,和退出(isExecuting, isFinished)
4、可以设置优先级,来改变执行状态:veryLow, Low,normal,high,veryHigh
5、回到主线程:[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSThread:
1、使用流程:start() -> 创建pthread -> main() -> [target performSelector:selector] -> exit()
2、通常配合RunLoop来实现线程的常驻
3、使用难度较大,在平时基本不怎么使用
多线程和锁
1、@syncchronized:创建单例对象使用
2、atomic:① 修饰属性关键字 ② 对被修饰对象进行院子操作,只是保证创建时的安全,并不保证使用时的安全
3、NSLock:lock,unlock,在方法套方法加锁时,会产生死锁
4、NSRecursiveLock:recusiveLock(加锁),recusive unLock(解锁),可以解锁lock中的递归锁,死锁问题
5、OSSpinLock:自选锁, ① 循环等待询问,不释放当前变量 ② 用于轻量级数据访问,简单值+1/-1操作
6、dispatch_semaphore_t:信号量加解锁(create,signal,wait)
几个问点:
iOS提供了几种多线程方案,以及各自的特点:
① GCD实现简单的线程同步,任务的派发,多读单写场景的解决
② NSOperation,方便我们对任务的状态进行控制,添加依赖,移除依赖,添加优先级等,常见于一些afn等三方库中
③ NSThread不常用,配合RunLoop来实现线程的常驻
网友评论