DateFormatterはコストがかかる。
だから、for文とかで、何回も生成していると、とても遅くなる。
ってことで、staticに定義して、使いまわそうというお話。
extensionで。
1 2 3 4 5 6 7 |
extension DateFormatter { static let shared: DateFormatter = { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() } |
で、注意したいのが2点。
localeに”en_US_POSIX”を指定している
localeに”en_US_POSIX”を指定して、想定したフォーマット通りに動くようにしています。
GDCや、OperationQueueで同時実行する時は注意
例えば、実際に使用する際には、
1 2 |
DateFormatter.shared.dateFormat = "yyyy-MM-dd" DateFormatter.shared.date(from: "2017-07-25") |
って感じで使うと思うけど、これを例えば、GDCとか使って、同時に実行したりすると、
1行目と2行目の間に、dateFormatが想定外の値に更新されちゃったりして、バグになる可能性がある。
上の2行だけだと、あまり起こらないかもしれないが、dateFormatをセットするところと、使用するところが、離れたりすると、見落としがちなので、注意。
そういうときは、各オペレーションごとに、DateFormatterを生成して、同じオペレーション内で使いまわすようにする。
コメント