gpt4 book ai didi

ios - NSDate处理非常占用CPU

转载 作者:行者123 更新时间:2023-12-01 17:30:34 31 4
gpt4 key购买 nike

我的代码中有一个方法可以处理需要在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];
}

更新:
还请检查(并赞扬)以下有关 NSCalendar -currentCalendar昂贵的 mrueg's评论。以上两种技术也都可以缓存 NSCalendar实例。

关于ios - NSDate处理非常占用CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25219161/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com