美文网首页
dispatch_group 和 dispatch_semaph

dispatch_group 和 dispatch_semaph

作者: 起个名字真难啊2015 | 来源:发表于2017-03-14 19:05 被阅读40次

常见用法:

dispatch_queue_t queue = dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  dispatch_group_t group = dispatch_group_create();
  for(id obj in array)
      dispatch_group_async(group, queue, ^{
          [self doSomethingIntensiveWith:obj];
      });
  //等group里的task都执行完后执行notify方法里的内容,相当于把wait方法及之后要执行的代码合到一起了
  dispatch_group_notify(group, queue, ^{
      [self doSomethingWith:array];
  });

信号量:

/// Returns the cached model class meta
+ (instancetype)metaWithClass:(Class)cls {
    if (!cls) return nil;
    static CFMutableDictionaryRef cache;
    static dispatch_once_t onceToken;
    static dispatch_semaphore_t lock;
    dispatch_once(&onceToken, ^{
        cache = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
        lock = dispatch_semaphore_create(1);
    });
    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
    _YYModelMeta *meta = CFDictionaryGetValue(cache, (__bridge const void *)(cls));
    dispatch_semaphore_signal(lock);
    if (!meta || meta->_classInfo.needUpdate) {
        meta = [[_YYModelMeta alloc] initWithClass:cls];
        if (meta) {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
            CFDictionarySetValue(cache, (__bridge const void *)(cls), (__bridge const void *)(meta));
            dispatch_semaphore_signal(lock);
        }
    }
    return meta;
}

关于信号量,一般可以用停车来比喻。
  停车场剩余4个车位,那么即使同时来了四辆车也能停的下。如果此时来了五辆车,那么就有一辆需要等待。信号量的值就相当于剩余车位的数目,dispatch_semaphore_wait函数就相当于来了一辆车,dispatch_semaphore_signal就相当于走了一辆车。停车位的剩余数目在初始化的时候就已经指明了(dispatch_semaphore_create(long value)),调用一次dispatch_semaphore_signal,剩余的车位就增加一个;调用一次dispatch_semaphore_wait剩余车位就减少一个;当剩余车位为0时,再来车(即调用dispatch_semaphore_wait)就只能等待。有可能同时有几辆车等待一个停车位。有些车主没有耐心,给自己设定了一段等待时间,这段时间内等不到停车位就走了,如果等到了就开进去停车。而有些车主就像把车停在这,所以就一直等下去。

相关文章

  • dispatch_group 和 dispatch_semaph

    常见用法: 信号量: 关于信号量,一般可以用停车来比喻。停车场剩余4个车位,那么即使同时来了四辆车也能停的下。如果...

  • 使用dispatch_group、dispatch_semaph

    在日常工作过程中,经常会遇到多线程任务的情况,如果需要同时进行多个线程任务而APP又需要对多线程进行管理,那么就可...

  • 使用dispatch_group、dispatch_semaph

    在日常工作过程中,经常会遇到多线程任务的情况,如果需要同时进行多个线程任务而APP又需要对多线程进行管理,那么就可...

  • GCD之调度组diapatch_group

    调度函数:dispatch_group dispatch_group是GCD(Grand Central Disp...

  • iOS多线程

    GCD 同步/异步 和 串行/ 并发 dispatch_barrier_async dispatch_group ...

  • iOS 多线程GCD之dispatch_group

    iOS 多线程GCD之dispatch_group 本文通过介绍dispatch_group基本功能,通过实例讲解...

  • 多线程相关

    1.GCD 同步/异步和串行/并发 dispatch_barrier_async dispatch_group (...

  • GCD代码小计

    GCD代码记录,以便后用 dispatch_group dispatch_group_enter和dispatch...

  • dispatch备忘录

    记录一些平时不会注意到的dispatch点 dispatch_group dispatch_group的底层实现是...

  • iOS中的GCD(四)

    dispatch_group dispatch_group最常见的功能就是,进入一个页面有多个网络请求,我们想在所...

网友评论

      本文标题:dispatch_group 和 dispatch_semaph

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