iOS/SwiftでDateFormattersを作成し、.dateFormatsを高価に設定していると、SOやブログでさまざまなテイクを読んだことが分かりましたが、 DateFormatter
と.dateFormat
を効率的に処理するための最良の方法です。具体的には、AppleのiPhone WeatherアプリのUIをほぼ模倣したアプリで作業しています。日付はAPI経由でtimeIntervalSince1970
/Unix形式で到着します。各ビューコントローラでは、現在の天気に1つの.dateFormat
を使用します。 「EEEE、MMM dd、y」、日別天気図ビューの7つのセルのそれぞれの日付をフォーマットするためのもう1つ。 「EEEE」、および横方向にスクロールしているコレクションビュー内の24個のセルの1時間の別のものである。 "ハ"。ユーザーは、保存した場所ごとにさまざまなビューコントローラーを表示します。私はパフォーマンスヒットの多くに気づいていませんが、私は実際に私が最も効率的であることを確実にしたいと思っており、これを適切に考えています(例えばシングルトンは行く方法ですか?)。Swift DateFormatterと.dateFormatの効率が混乱している
私はスタティック変数として単一の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を設定しているため、私をあまり保存しません。もしそうなら、より健全なアプローチがありますか?私をまっすぐに設定してくれてありがとう
は、これは私には時期尚早な最適化のように思えます。 'DateFormatter'sを使って何千/何千もの日付をフォーマットしない限り、実際にそのパフォーマンスについて心配するべきではありません。特に、アプリがサポートしている最も古いデバイスでコードをテストしてもパフォーマンス上の問題が見られなかった場合は、コードを実行するのが良いはずです。 –
クラス名はFormatterにしないでください。 Swiftには既にクラスバンドフォーマッタがあります。拡張機能を使って静的メソッドやプロパティを追加するだけです。 https://developer.apple.com/documentation/foundation/formatter –
'var'を使ってdateFormatterを宣言する必要はありません。 'DateFormatter'それはクラスなので、宣言してもそのプロパティを変更することができます。 –