据我所知,在iOS / Swift中创建DateFormatters并设置.dateFormats是昂贵的,我在SO和博客中阅读了一些不同的内容,但我仍然不确定有效处理{{1 }和DateFormatter
。具体来说,我正在使用一个大致模仿Apple的iPhone Weather app UI的应用程序。日期以.dateFormat
/ Unix格式通过API到达。在每个视图控制器上,我将使用一个timeIntervalSince1970
作为当前天气,例如“EEEE,MMM dd,y”,另一个用于在每日天气表视图中的每个7个单元格中格式化日期,例如“EEEE”,另一个是水平滚动集合视图中的24个单元格中的小时,例如“哈”。用户还可以为他们保存的每个位置浏览各种视图控制器。我没有注意到性能受到很大影响,但我真的很想确保我的效率最高,并且正确地考虑到这一点(例如单身人士的方式是什么?)。
我创建了一个单一.dateFormat
的单例作为静态变量,还创建了一个函数来设置日期格式化程序的DateFormatter
和.dateFormat
(见下文)。基于之前的阅读,我假设如果我坚持使用iOS 10或更高版本,我就不必担心线程安全问题了。无论如何,这种应用程序可能不会引起关注。
.timeZone
每次我需要在视图或自定义单元格类中设置日期时,我只需调用该函数,传入适当的值,如下所示:
class Formatter {
static var dateFormatter = DateFormatter()
private init() {}
static func formatTimeForTimeZone(unixDate: TimeInterval, formatString: String, timeZone: String) -> String {
let usableDate = Date(timeIntervalSince1970: unixDate)
self.dateFormatter.dateFormat = formatString
self.dateFormatter.timeZone = TimeZone(identifier: timeZone)
let dateString = self.dateFormatter.string(from: usableDate)
return dateString
}
}
这种方法不能为我节省多少是正确的,因为我在每次调用时都设置了一个.formatString(在每个单元格中)?如果是这样,是否有更健全的方法?高级谢谢你让我顺利。
答案 0 :(得分:0)
为了更好的答案而被编辑: 感谢Leo让我直截了当提供建议。 在审查选项和&尝试了一些事情,我最终使用的解决方案是创建一个私有全局数据格式化程序,在每个需要dateFormatter的类的顶部使用特定于类的dateFormat String。作为全局提供持久性,所以我不重新创建DateFormatter或设置.dateFormat字符串(所有据称都很昂贵)。全局在下面,只有类更改为.dateFormat字符串
private let dateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "EEEE, MMM dd, y"
return dateFormatter
}()
然后,我创建了一个TimeInterval扩展,它处理了我需要的格式,采用了IANA时区字符串和DateFormatter(在调用时传入类的全局)。
extension TimeInterval {
func format(timeZone: String, dateFormatter: DateFormatter) -> String {
let usableDate = Date(timeIntervalSince1970: self)
dateFormatter.timeZone = TimeZone(identifier: timeZone)
let dateString = dateFormatter.string(from: usableDate)
return dateString
}
}
如果有人也在寻找替代方案,那么mluton / sandmoose提供的缓存方法非常好: https://gist.github.com/mluton/98ab2b82bd18f7a7f762#file-cacheddateformatter-swift