Он хорошо знал, что создание NSDateFormatters - это expensive '
Даже Apple Руководство по форматированию данных (обновлено 2014-02) гласит:
Создание форматирования даты не является дешевой операцией. Если вы, вероятно, часто используете форматтер, обычно более эффективно кэшировать один экземпляр, чем создавать и удалять несколько экземпляров. Один из подходов состоит в использовании статической переменной.
Но этот документ, по-видимому, не соответствует современным требованиям, и я также не могу найти ничего об этом в последнем описании класса NSDateFormatter кеширование форматирования, поэтому я могу только предположить, что это так же дорого, как и для objective-c.
Многие источники предлагают кэширование форматера внутри класса, используя его, например контроллер или представление.
Мне было интересно, было бы удобно или даже "дешевле" добавить в проект одноэлементный класс для хранения даты, поэтому вы уверены, что никогда не нужно создавать его снова. Это можно использовать везде в приложении. Вы также можете создать несколько общих экземпляров, содержащих несколько датпикеров. Например, один датпикер для отображения дат и один для обозначения времени:
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")
Будет ли любая из них быть хорошей или ужасной идеей? И переключение формата тоже дорого?
Update: Как Горячие Лики и Лоренцо Росси указывают, что переключение форматов, вероятно, не такая хорошая идея (Не поток безопасный и такой же дорогой, как воссоздание..).