【发布时间】:2015-02-03 23:36:12
【问题描述】:
已知创建 NSDateFormatters 是 well 'expensive'
甚至 Apple 的 Data Formatting Guide(2014 年 2 月更新)声明:
创建日期格式化程序并不是一项廉价的操作。如果您可能经常使用格式化程序,则缓存单个实例通常比创建和处置多个实例更有效。一种方法是使用静态变量。
但是该文档似乎与 swift 并没有真正保持同步,而且我在最新的NSDateFormatter Class Reference 中也找不到任何关于缓存格式化程序的信息,所以我只能假设它对于 swift 来说和它一样昂贵目标-c。
很多消息来源建议caching 使用它的类中的格式化程序,例如控制器或视图。
我想知道在项目中添加一个单例类来存储日期选择器是否方便甚至“便宜”,这样您就可以放心,再也不需要再次创建它了。这可以在应用程序的任何地方使用。您还可以创建多个包含多个日期选择器的共享实例。例如,一个用于显示日期的日期选择器和一个用于时间符号的日期选择器:
class DateformatterManager {
var formatter = NSDateFormatter()
class var dateFormatManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
// date shown as date in some tableviews
Static.instance.formatter.dateFormat = "yyyy-MM-dd"
return Static.instance
}
class var timeFormatManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
// date shown as time in some tableviews
Static.instance.formatter.dateFormat = "HH:mm"
return Static.instance
}
// MARK: - Helpers
func stringFromDate(date: NSDate) -> String {
return self.formatter.stringFromDate(date)
}
func dateFromString(date: String) -> NSDate? {
return self.formatter.dateFromString(date)!
}
}
// Usage would be something like:
DateformatterManager.dateFormatManager.dateFromString("2014-12-05")
另一种类似的方法是只创建一个单例并根据需要切换格式:
class DateformatterManager {
var formatter = NSDateFormatter()
var dateFormatter : NSDateFormatter{
get {
// date shown as date in some tableviews
formatter.dateFormat = "yyyy-MM-dd"
return formatter
}
}
var timeFormatter : NSDateFormatter{
get {
// date shown as time in some tableviews
formatter.dateFormat = "HH:mm"
return formatter
}
}
class var sharedManager : DateformatterManager {
struct Static {
static let instance : DateformatterManager = DateformatterManager()
}
return Static.instance
}
// MARK: - Helpers
func dateStringFromDate(date: NSDate) -> String {
return self.dateFormatter.stringFromDate(date)
}
func dateFromDateString(date: String) -> NSDate? {
return self.dateFormatter.dateFromString(date)!
}
func timeStringFromDate(date: NSDate) -> String {
return self.timeFormatter.stringFromDate(date)
}
func dateFromTimeString(date: String) -> NSDate? {
return self.timeFormatter.dateFromString(date)!
}
}
// Usage would be something like:
var DateformatterManager.sharedManager.dateFromDateString("2014-12-05")
其中任何一个是好主意还是坏主意?转换格式也很贵吗?
更新: 正如Hot Licks 和Lorenzo Rossi 指出的那样,切换格式可能不是一个好主意(不是线程安全的,而且与重新创建一样昂贵......)。
【问题讨论】:
-
请注意,无论 NSDateFormatter 本身是否是“线程安全的”,当格式化程序有可能在另一个线程中使用时,不得在一个线程中更改格式。这就是为什么最好让全局格式化程序具有固定格式而不是在每次使用时更改它的原因之一。
-
不错,谢谢!在第一个示例中这不是问题吗?如果我做对了,每个实例的格式都不会改变。
-
我认为对于每种类型的格式,您都可以拥有一个日期格式化程序。
-
另一个不改变格式的好理由是它会提供no性能改进:正如this WWDC video中所述“设置格式与重新创造”
-
啊,不知道。谢谢!
标签: ios cocoa caching swift nsdatepicker