使用dispatch_once

Ker*_*rog 3 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]];
}
Run Code Online (Sandbox Code Playgroud)

我得到建议将上面的代码更改为:

+ (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]];
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?为什么我必须使用dispatch_once?

Bra*_*red 5

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

if errorDescriptions == nil如果您将使用,您不需要也不应该检查dispatch_once.