在 UITableViews cellForRowAt 方法中使用 DateFormatters 的最佳方法是什么

问题描述 投票:0回答:1

我有一个表格视图,其中单元格很少。我需要以人类可读的格式显示日期,其原始格式是从 API 调用中检索的。我使用下面的代码来调用 ConvertToDate 函数,该函数负责获取格式为“yyyy-MM-dd'T'HH:mm:ssX”的原始日期字符串并将其转换为“MMMM dd, yyyy 'at' hh:嗯”。然而,据我们所知,日期格式化程序可能很昂贵。任何人都可以帮我回答一些关于下面的代码实现的问题吗?

注意:我正在从 tableView 内的 cellForRowAt 方法调用函数 ConvertToDate

  1. 创建一个单例类以便仅创建一个 Dateformatter 实例(因此成本较低)是一种好习惯吗

  2. 我还创建了一个并发的 DispatchQueue,以便 Dateformatter 是线程安全的。这是好的做法吗?

  3. 使用convertToDate并发调用convertToDate会导致滚动表视图时性能滞后吗?

  4. 一般有没有处理/创建日期格式器的标准参考?

以下代码将:“2023-12-22T13:17:27Z”转换为“2023 年 12 月 22 日下午 01:17”

代码

import Foundation

class DateUtils {
    
    static let shared = DateUtils()
    let dateFormatter = DateFormatter()
    
    // Date formatter are not thread safe and adding this to a concurrent queue makes if safer.
    // For table views cells this may have minimal impact and needs to have performance tested in different cases where used.
    private let dateFormatterQueue = DispatchQueue(label: "com.example.dateformatter",
                                                   attributes: .concurrent)
    
    private init(){}
    
    func convertToDate(from date: String,
                       with format: String = "yyyy-MM-dd'T'HH:mm:ssX",
                       to: String = "MMMM dd, yyyy 'at' hh:mm a") -> String? {
        
        var formattedDate: String?
        
        dateFormatter.dateFormat = format
        guard let date = dateFormatter.date(from: date) else {
            return nil
        }
        dateFormatter.dateFormat = to
        
        dateFormatterQueue.sync {
            formattedDate = dateFormatter.string(from: date)
        }
        return formattedDate
    }
}
ios swift dateformatter
1个回答
0
投票
  1. 不,
    DateFormatter
    扩展中的静态属性将是更好的选择。
  2. 没有。
  3. 没有。
  4. 不需要
    Dateformatter

API 调用很可能返回 JSON。

在模型中定义代表日期的属性

let date: Date

并将

.iso8601
策略添加到解码器以将 ISO 字符串即时转换为
Date

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601

在单元格格式中以现代方式显示日期

cell.date = item.date.formatted( Date.FormatStyle()
                     .year()
                     .month(.wide)
                     .day(.twoDigits)
                     .hour(.twoDigits(amPM: .abbreviated))
                     .minute()
                     .locale(.init(identifier: "en_US")))
© www.soinside.com 2019 - 2024. All rights reserved.