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?
您不必使用它,但是您在块中放置的内容只能以线程安全的方式执行一次.
if errorDescriptions == nil如果您将使用,您不需要也不应该检查dispatch_once.