0

我知道在 iOS/Swift 中创建 DateFormatters 和设置 .dateFormats 是很昂贵的,我已经在 SO 和博客中阅读了很多不同的观点,但我仍然不确定有效处理DateFormatter.dateFormat. 具体来说,我正在使用一个大致模仿苹果 iPhone 天气应用程序 UI 的应用程序。timeIntervalSince1970日期通过 API 以/Unix 格式到达。在每个视图控制器上,我将使用一个.dateFormat用于当前天气,例如“EEEE,MMM dd,y”,另一个用于在每日天气表视图中的 7 个单元格中格式化日期,例如“EEEE”,另一个用于水平滚动集合视图中 24 个单元格中的小时,例如“哈”。用户还为他们保存的每个位置翻阅各种视图控制器。我没有注意到对性能的影响很大,但我真的很想确保我是最有效率的,并且正确地考虑了这一点(例如单例是要走的路吗?)。

我创建了一个单例DateFormatter作为静态变量,还创建了一个函数来设置日期格式化程序的.dateFormat和(见下文)。.timeZone根据之前的阅读,我假设如果我坚持使用 iOS 10 或更高版本,我不必担心线程安全性,而且无论如何在这类应用程序中它可能不是问题。

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
    }
}

每次我需要在视图或自定义单元格类中设置日期时,我只需调用该函数,传入适当的值,如下所示:

let dateString = Formatter.formatTimeForTimeZone(unixDate: someTime, formatString: someFormatString, timeZone: someTimeZone)

由于我在每次调用(在每个单元格中)设置一个 .formatString ,这种方法并没有为我节省太多,这是否正确?如果是这样,是否有更合理的方法?高级感谢您让我直截了当。

4

1 回答 1

0

编辑以获得更好的答案:感谢 Leo 让我直截了当并提供建议。在查看了选项并尝试了一些事情之后,我最终使用的解决方案是在每个需要 dateFormatter 的类的顶部创建一个私有的全局数据格式化程序,其中包含特定于类的 dateFormat String。全球性提供持久性,因此我不会重新创建 DateFormatter 或设置 .dateFormat String (据称都是昂贵的)。全局如下,仅更改类到类是 .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

于 2017-10-28T02:17:14.130 回答