不明白在init中使用semaphone

时间:2014-11-20 14:47:35

标签: ios objective-c concurrency grand-central-dispatch semaphore

+(instancetype) objectWithAttribute:(NSString *)attribute {    

__block id newInstance;
    dispatch_semaphore_t s = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
        newInstance = [[Object alloc] initWithAttribute:attribute];
        dispatch_semaphore_signal(s);
    });
    dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
    return newInstance;

}

所以我遇到了这段代码。我对信号量和并发性的理解非常有限。但对我来说,这段代码:

  1. 设置信号量令牌。
  2. dispatch_async初始化对象的块。
  3. 在创建对象后发出信号,表明可以返回新实例。
  4. 我通过阅读这里标记的答案得出了这个结论:Intangible Order of Execution (dispatch_semaphore_t, dispatch_group_async) and the Use of Them in Combination with Different Dispatch Queue Types

    如果你进入init和那里的逻辑,没有任何东西超出正常流程或新线程或任何东西。我的问题是,为什么我不能用以下方法替换上述方法:

    +(instancetype) objectWithAttribute:(NSString *)attribute {
    
        id newInstance = [[Object alloc] initWithAttribute:attribute];
        return newInstance;
    
    }
    

    由于

1 个答案:

答案 0 :(得分:0)

在后台队列中使用信号量和dispatch_async似乎毫无意义。它应该是你认为它应该是。

如果被调用的代码已经是异步调用,则使用信号量可能有意义。但是没有理由强迫alloc / init进入后台。