多线程使用中注意的问题:
数据竞争: 多个线程访问同一个数据源
死锁:多个线程相互等待对方的完成
太多的线程将导致消耗大量的内存
对于 长时间的处理不应放在主线程中,否则会导致主线程阻塞,界面卡顿
dispatch_async(dispatch_queue,block)
dispatch_queue包含两种:
serial queue:顾名思义按顺序执行添加到它里面的block
Concurrent queue:并行的执行添加到它里面的block
dispatch_queue的生成:
第一种生成方法: dispatch_queue_create (para1,para2) 返回值类型为:dispatch_queue_t
para1: dispatch_queue 名称
para2: DISPATCH_QUEUE_CONCURRENT 生成的queue为并行,NULL 生成的queue为串行
用这种方式生成的queue需要手动释放,用dispatch_release(dispatch_queue_name)
生成serial dispatch queue可以有效避免数据竞争,因此在对同一数据源更新时应使用serial dispatch queue.生成大量的serial dispatch queue会导致内存消耗加剧,影响性能
第二种:获取系统提供的dispatch_queue: main_dispatch_queue与global_dispatch_queue
用dispatch_queue_create创建的queue 具有与dispatch_global_queue默认优先级相同的优先级,如果需要更改起优先级,用函数:dispatch_set_target_queue(para1,para2)
para1: 需要更改优先级的queue,只能是用dispatch_queue_create创建的queue
para2: 类型为diapatch_queue_t
dispatch_after: 在指定时间后执行处理
dispatch_group: 多个处理结束后,执行结束处理
diapatch_group_notify(group,
dispatch_group_wait(group,DISPATCH_TIME_FOREVER)其中DISPATCH_TIEM_FOREVER为等待时间,永久等待,只要添加到dispatch_group中的任务没有完成,将一直等下去
也可以指定时间:其类型应为dispatch_time_t 类型
如指定一秒:dispatch_time_t time = dispatch_time_t (dispatch_time_now, 1ull *NSEC_PER_SEC)
long result = dispatch_group_wait(group,time)
if result == 0{
// 所有的任务在指定时间内完成
}else {
//至少有一个任务没有在指定时间内完成
}
所谓的等待,是指调用dispatch_group_wait()函数的线程停止
执行完成后释放:dispatch_release(group)
dispatch_barrizer_async: 解决在写入操作没有结束情况下,读取操作不可执行的问题
dispatch_barrizer_async 函数会等待追加到Concurrent dispatch_quue中的并行执行的处理完成之后,在讲指定的处理追加到concurrent dispatch queue 中并执行完毕之后,才会执行concurrent dispatch queue中未完成的任务
dispatch_apply :该函数按照的指定次数追加指定的block到指定的dispatch_queue中,并等待全部处理执行结束
通常与dispatch_async()结合使用
dispatch_suspend(queue):挂起指定的dispatch_queue
对正在改queue中执行的任务没有影响,但该任务执行完成后,后面的任务将停止执行
dispatch_resume(queue): 恢复指定的dispatch_queue
恢复之后,该queue中未执行的任务将继续执行
dispatch_semaphore: 更好的处理并行更新数据,产生数据不一致的问题
dispatch_semaphore:是持有计数的信号,所谓信号,类似于过马路时的手旗,当旗子举起时,禁止通行,当旗子放下时,放行。在dispatch中,计数等于0时,等待,大于1或为一时,减去一而不等待
用dispatch_semaphore_create来创建dispatch_semaphore
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1)
参数表示计数初始值。必须通过dispatch_release释放,dispatch_retain持有
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER)
该函数用于等待semaphore的记数值大于或等于一时该函数返回并且计数值减一
dispatch_semaphore_signal(semaphore) 使得semaphore计数值加一
Dispatch_once:在应用中只执行一次指定处理的API
Dispatch I/O 当读取较大的文件时,将大文件分块,用多线程并行读取