在项目中,许多页面要用到 DateFormatter,还有许多的日期格式,然后就创建许多 DateFormatter,而创建 DateFormatter 是需要许多开销的,还是会影响性能的,虽然现在设备的性能很高,但还是值得去优化的。

Apple 的文档中也提到:

Creating a date formatter is not a cheap operation. If you are likely to use a formatter frequently, it is typically more efficient to cache a single instance than to create and dispose of multiple instances. One approach is to use a static variable.

Apple 也给出了一个解决办法,就是使用静态变量,但是这样每次使用都要重新设置日期格式,而且还是线程不安全的。

最后找到一种更好的解决办法,把 DateFormatter 对象保存在线程字典 threadDictionary 里,使用时只要传进来一个时间格式,就返回一个对象,同时也是线程安全的。

1
2
3
4
5
6
7
8
9
10
11
12
extension DateFormatter {
class func format(_ format: String) -> DateFormatter {
let threadDictionary = Thread.current.threadDictionary
var dateFormatter = threadDictionary.object(forKey: format) as? DateFormatter
if dateFormatter == nil {
dateFormatter = DateFormatter()
dateFormatter!.dateFormat = format
threadDictionary.setObject(dateFormatter!, forKey: NSString(string: format))
}
return dateFormatter!
}
}

使用时就很简单了:

1
let dateformatter = DateFormatter.format("yyyy-MM-dd HH:mm:ss")

关于日期格式,这里有个网站不错:

相关链接