我的代码中有一个方法可以处理需要在NSDate中转换的字符串。这种方法每秒被称为数百次,显然效率很低。如何尽可能地改善它?
- (NSDate *)getDateFromString:(NSString *)dateString
{
NSDateFormatter* formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate* date = [formatter dateFromString:dateString];
if (date == nil) {
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
date = [formatter dateFromString:dateString];
}
return date;
}
您可以做的第一件事就是不要在每次调用时都创建该格式化程序实例!
创建格式化程序非常昂贵。从Apple的“数据格式指南”中:
创建日期格式器并不是一项便宜的操作。如果您可能经常使用格式化程序,则缓存单个实例通常比创建和处置多个实例更为有效。
您可以使用static
var或属性和延迟加载模式来执行此操作。例如,使用static
:
-(NSDate *)getDateFromString:(NSString *)dateString{
static NSDateFormatter *formatterWithZone = nil;
static NSDateFormatter *formatterWithoutZone = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatterWithZone = [NSDateFormatter new];
[formatterWithZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
[formatterWithZone setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
formatterWithoutZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
});
NSDate *date = [formatterWithZone dateFromString:dateString];
//...
date = [formatterWithoutZone dateFromString:dateString];
}
或者,如果要在其他地方使用格式化程序,请将其放在属性中:
@property (nonatomic) NSDateFormatter *formatterWithZone;
@property (nonatomic) NSDateFormatter *formatterWithoutZone;
//...
-(NSDateFormatter *)formatterWithZone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_formatterWithZone = [NSDateFormatter new];
[_formatterWithZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
[_formatterWithZone setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
});
return _formatterWithZone;
}
-(NSDateFormatter *)formatterWithoutZone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_formatterWithoutZone = [NSDateFormatter new];
[_formatterWithoutZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
});
return _formatterWithoutZone;
}
-(NSDate *)getDateFromString:(NSString *)dateString{
NSDate* date = [[self formatterWithZone] dateFromString:dateString];
//...
date = [[self formatterWithoutZone] dateFromString:dateString];
}
更新:还请查看(并赞扬)以下mrueg的有关NSCalendar -currentCalendar
价格昂贵的评论。以上两种技术也都可以缓存NSCalendar
实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句