4

我有以下代码:

  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?

4

3 回答 3

6

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

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

于 2013-10-21T20:36:12.317 回答
4

dispatch_once 用于创建初始化昂贵的对象,或在对象初始化时阻塞其他线程。这些情况都不适用于这里。初始化该对象多少次都没关系,而且需要特殊处理并不昂贵。在我看来这毫无意义。布拉德说第二个区块中的 if 是多余的是正确的。

于 2013-10-21T20:40:25.217 回答
1

最有可能防止竞争条件。

于 2013-10-21T20:35:01.510 回答