NSDateFormatter使用思考

标签(空格分隔): NSDateFormatter


最近看项目代码的时候,发现对NSDateFormatter的使用有一些不好的地方,由于NSDateFormatter的生成很消耗资源,因此不建议每次使用都重新生成一个,而是使用一个全局的NSDateFormatter来完成所有需求。项目中,发现cell绑定数据时每次都会重新生成一个NSDateFormatter对象,这样使用会有一定耗时,虽然新手机硬件性能很高,无法感知这点时间,但是通过实际测试,还是发现使用全局的与每次重新生成,性能差距在50倍左右,还是值得优化的。
因此就想扩展NSDateFormatter,使其能根据每次date format 的不同,返回相应的NSDateFormatter,并且缓存相应的实例,下次访问可以直接获取,节省创建的时间,这样只在第一次创建的时候有一定时间消耗。stackoverflow有几个专门针对这个问题的讨论:
1. How to minimize the costs for allocating and initializing an NSDateFormatter?
2. Is caching a NSDateformatter application-wide good idea?

一些人从实际的项目经验中介绍了该如何全局访问,由于项目中一开始使用的场景大概有八种,基本都是设置date formatter格式的。方案大概经过了如下一些过程。
1. 设置一个全局的NSDateFormatter单例对象,每次使用都设置相应的date format,这种方案设计最简单,但是每次使用都需要根据需求设置不同的时间格式。如果存在多线程访问,就会有同步问题,因此这个方案不可行。
2. 增加一个NSDateFormatter分类,针对以上场景分别设置不同时间格式单例对象,这样就避免了每次修改时间格式的问题。但是接口太多,使用起来繁琐。
3. 基于以上,决定提供一个统一接口,使用只要传进来一个时间格式,就返回一个对象。内部对于对象保存起来,下次请求直接返回已经保存的对象,这样节省好多时间。同时要考虑线程安全性,准备借鉴国外用户的做法,将对象保存到线程dictionary里面。


+ (NSDateFormatter *)dateFormatterWithFormatString:(NSString *)format
{

// 版本1.
//    static dispatch_once_t onceToken;
//    static NSMutableDictionary *formatterDic;
//    dispatch_once(&onceToken, ^{
//        formatterDic = [NSMutableDictionary dictionaryWithCapacity:8];
//    });
//    
//    NSDateFormatter *dateFormatter_ = [formatterDic objectForKey:format];
//    if (dateFormatter_ == nil) {
//        @synchronized(formatterDic){
//            dateFormatter_ = [NSDateFormatter new];
//            dateFormatter_.dateFormat = format;
//            [formatterDic setObject:dateFormatter_ forKey:format];
//            
//            //可能需要设置一些默认属性,防止用户默认的设置造成时间转换问题,这个后续再看
            [dateFormatter_ setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]];
            [dateFormatter_ setLocale: [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
            [dateFormatter_ setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
//        }
//        
//    }
//    
//    return dateFormatter_;

    // 版本2 ,使用当前线程字典来保存对象
    NSMutableDictionary *threadDic = [[NSThread currentThread] threadDictionary];
    NSDateFormatter *dateFormatter = [threadDic objectForKey:format];
    if (!dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc]init];
        dateFormatter.dateFormat = format;
        [threadDic setObject:dateFormatter forKey:format];
    }
    return dateFormatter;

}

上面就是这段代码逻辑,包含头文件,使用很简单:

     NSDateFormatter *dateFormatter = [NSDateFormatter dateFormatterWithFormatString:@"MM/dd/yyyy"];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值