iOS GCD

作者: HackerOnce | 来源:发表于2015-05-27 20:16 被阅读475次

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

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

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

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

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

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

    相关文章

      网友评论

        本文标题:iOS GCD

        本文链接:https://www.haomeiwen.com/subject/ayyrqttx.html