我有以下代码:
static NSDictionary * errorDescriptions = nil;
+ (NSString *) errorsFromCode: (WPErrorCode) code {
if(errorDescriptions == nil) {
errorDescriptions = @{[NSNumber numberWithInt: InvalidCar]: NSLocalizedStringFromTable(@"Car is invalid.", @"WePay", @"validation: invalid car"), ...
}
return [errorDescriptions objectForKey: [NSNumber numberWithInt: code]];
}
我建议将上面的代码更改为:
+ (NSString *) errorsFromCode: (WPErrorCode) code {
static NSDictionary * errorDescriptions = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
errorDescriptions = @{[NSNumber numberWithInt: InvalidCar]: NSLocalizedStringFromTable(@"Car is invalid.", @"WePay", @"validation: invalid car"), ...
}
return [errorDescriptions objectForKey: [NSNumber numberWithInt: code]];
}
为什么会这样?为什么我必须使用dispatch_once?
答案 0 :(得分:5)
您不必使用它,但是您在块中放置的内容只能以线程安全的方式执行一次。
您不需要也不应该if errorDescriptions == nil
检查您是否使用dispatch_once
。
答案 1 :(得分:4)
dispatch_once用于创建初始化成本高的对象,或者在初始化对象时阻止其他线程。这些情况都不适用于此。初始化该对象的次数并不重要,并且需要特殊处理并不昂贵。这对我来说毫无意义。布拉德是正确的说第二个街区中的if是多余的。
答案 2 :(得分:1)
最有可能阻止竞争状态。