2017-10-27 8 views
0

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を設定しているため、私をあまり保存しません。もしそうなら、より健全なアプローチがありますか?私をまっすぐに設定してくれてありがとう

+3

は、これは私には時期尚早な最適化のように思えます。 'DateFormatter'sを使って何千/何千もの日付をフォーマットしない限り、実際にそのパフォーマンスについて心配するべきではありません。特に、アプリがサポートしている最も古いデバイスでコードをテストしてもパフォーマンス上の問題が見られなかった場合は、コードを実行するのが良いはずです。 –

+0

クラス名はFormatterにしないでください。 Swiftには既にクラスバンドフォーマッタがあります。拡張機能を使って静的メソッドやプロパティを追加するだけです。 https://developer.apple.com/documentation/foundation/formatter –

+0

'var'を使ってdateFormatterを宣言する必要はありません。 'DateFormatter'それはクラスなので、宣言してもそのプロパティを変更することができます。 –

答えて

0

回答ありがとうございます。 私にストレートを設定していただきありがとうございます。&提案があります。 いくつか試してみた&のオプションを見直した後、私が使用したソリューションは、dateFormatterを必要とする各クラスの上に、クラス固有のdateFormat Stringを持つプライベートなグローバルデータフォーマッタを作成することでした。グローバルであることは永続性を提供するので、私はDateFormatterを再作成したり、.dateFormat String(すべての高価な疑いのあるもの)を設定していません。世界は、私はその後、(合格IANAタイムゾーンの文字列とたDateFormatterを取って、私は必要な書式設定を取り扱う時間間隔の延長を作成したクラスとクラスのみの変更は

private let dateFormatter: DateFormatter = { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "EEEE, MMM dd, y" 
    return dateFormatter 
}() 

.dateFormat文字列

ていると、以下の通りですクラスのグローバルで、呼び出されるとき)。

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

関連する問題