使用dispatch_once

时间:2013-10-21 20:31:50

标签: objective-c grand-central-dispatch

我有以下代码:

  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?

3 个答案:

答案 0 :(得分:5)

您不必使用它,但是您在块中放置的内容只能以线程安全的方式执行一次。

您不需要也不应该if errorDescriptions == nil检查您是否使用dispatch_once

答案 1 :(得分:4)

dispatch_once用于创建初始化成本高的对象,或者在初始化对象时阻止其他线程。这些情况都不适用于此。初始化该对象的次数并不重要,并且需要特殊处理并不昂贵。这对我来说毫无意义。布拉德是正确的说第二个街区中的if是多余的。

答案 2 :(得分:1)

最有可能阻止竞争状态。