gpt4 book ai didi

ios - 仍然对 Swift DateFormatter 和 .dateFormat 效率感到困惑

转载 作者:行者123 更新时间:2023-11-30 12:03:12 25 4
gpt4 key购买 nike

我知道在 iOS/Swift 中创建 DateFormatters 和设置 .dateFormats 是昂贵的,我已经在 SO 和博客中阅读了一堆不同的内容,但我仍然不确定有效处理 的最佳方法DateFormatter.dateFormat。具体来说,我正在使用一个大致模仿 Apple 的 iPhone 天气应用程序 UI 的应用程序。日期通过 API 以 timeIntervalSince1970/Unix 格式到达。在每个 View Controller 上,我将使用一个 .dateFormat 来表示当前天气,例如“EEEE,MMM dd,y”,另一个用于在每日天气 TableView 中的 7 个单元格中格式化日期,例如“EEEE”,另一个表示水平滚动 Collection View 中 24 个单元格中的小时,例如“哈”。用户还可以翻阅他们保存的每个位置的各种 View Controller 。我没有注意到性能受到太大影响,但我真的很想确保我的效率最高,并正确地思考这一点(例如,单例是正确的选择吗?)。

我创建了一个带有单个 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
}
}

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

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

这种方法并没有为我节省太多,因为我在每次调用时(在每个单元格中)设置一个 .formatString ,这是正确的吗?如果是这样,是否有更合理的方法?非常感谢您纠正我的错误。

最佳答案

编辑以获得更好的答案:感谢 Leo 让我直面问题并提供建议。在审查选项并尝试了一些事情之后,我最终使用的解决方案是创建一个私有(private)全局数据格式化程序,在每个需要 dateFormatter 的类之上使用特定于类的 dateFormat String 。全局提供持久性,因此我不会重新创建 DateFormatter 或设置 .dateFormat String (据称所有这些都很昂贵)。全局如下,仅将类与类之间的更改为 .dateFormat String

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

关于ios - 仍然对 Swift DateFormatter 和 .dateFormat 效率感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com