iOSiOS开发

iOS GCD

2015-05-27  本文已影响475人  HackerOnce

多线程使用中注意的问题:  

数据竞争: 多个线程访问同一个数据源

死锁:多个线程相互等待对方的完成

太多的线程将导致消耗大量的内存

对于 长时间的处理不应放在主线程中,否则会导致主线程阻塞,界面卡顿

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  当读取较大的文件时,将大文件分块,用多线程并行读取

上一篇下一篇

猜你喜欢

热点阅读