+(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;
}
所以我遇到了这段代码。我对信号量和并发性的理解非常有限。但对我来说,这段代码:
我通过阅读这里标记的答案得出了这个结论: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;
}
由于
答案 0 :(得分:0)
在后台队列中使用信号量和dispatch_async
似乎毫无意义。它应该是你认为它应该是。
如果被调用的代码已经是异步调用,则使用信号量可能有意义。但是没有理由强迫alloc / init进入后台。