有没有更短的版本?感觉就像很多样板。
我举几个例子,我认为这很乏味
+ (instancetype)sharedInstance
{
static dispatch_once_t onceToken;
static id instance;
dispatch_once(&onceToken, ^{
instance = [self new];
});
return instance;
}
+ (NSString *)RFC2822StringFromDate:(NSDate *)date
{
static NSDateFormatter *formatter;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatter = [NSDateFormatter new];
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
formatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
formatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss Z";
});
return [formatter stringFromDate:date];
}
最佳答案
我只是做了一个小宏,基本上可以让你写很短的东西
+ (instancetype)sharedInstance
{
return dispatch_once_and_return(id, [self new]);
}
此语义也支持块
+ (NSString *)altRFC2822StringFromDate:(NSDate *)date
{
NSDateFormatter *formatter = dispatch_once_and_return(NSDateFormatter *, ^{
NSDateFormatter *f = [NSDateFormatter new];
// setup formatter
return f;
}());
return [formatter stringFromDate:date];
}
(技巧是在块后添加
()
,这基本上立即执行了该块)。宏
#define dispatch_once_and_return(type, value) ({\
static type cachedValue;\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
cachedValue = value;\
});\
cachedValue;\
})
关于ios - 有没有更短的替代dispatch_once的选择?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22984775/