【问题标题】:API Exclude data if date is in the past如果日期是过去,则 API 排除数据
【发布时间】:2020-08-02 14:25:30
【问题描述】:

如果嵌套列表“调用”包含过去的属性,我正在尝试从我的 API 响应中排除数据

在响应中包含此数据:

[
   {
      "addressLineOne":"Test",
      "addressLineTwo":"Test2",
      "calls":{
         "dateTime":1597932000, // a date in the future
      },

]

排除此数据:

[
   {
      "addressLineOne":"Test",
      "addressLineTwo":"Test2",
      "calls":{
         "dateTime":1596193200 // a date in the past
      },

]

我正在使用 JSON 解码器进行 api 调用:

class Service {
    static let shared = Service()
    let BASE_URL = "url.com/JsonData"

    func fetchClient(completion: @escaping ([Client]) -> ()) {

        guard let url = URL(string: BASE_URL) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in

            // handle error
            if let error = error {
                print("Failed to fetch data with error: ", error.localizedDescription)
                return
            }

            guard let data = data else {return}

            do {
                let clients = try JSONDecoder().decode([Client].self, from: data)
                completion(clients)


            } catch let error {
                print("Failed to create JSON with error: ", error.localizedDescription)
            }
        }.resume()
    }
}

任何方向都将不胜感激

【问题讨论】:

  • 如果你控制后端,最好在那里进行过滤(即不要返回你不需要的数据)。除此之外,一旦你解码,filter 会从clients 的数组中取出。
  • 您可以使用集合的过滤功能来删除日期过去的客户。或者,您使用的 API 可能通过向查询添加参数来支持过滤。你试过什么?
  • 不相关但从不在 JSONDecoder/Encoder 捕获块中打印 error.localizedDescription。始终只打印 error 实例以获取 real 错误消息。另请阅读您的previous questiion的(已接受)答案

标签: swift


【解决方案1】:

设法通过添加过滤器并使用内置的Calendar 函数检查日期来解决它:

class Service {
    static let shared = Service()
    let BASE_URL = "url.com/JsonData"
    let calendar = Calendar.current
    
    func fetchClient(completion: @escaping ([Client]) -> ()) {

        guard let url = URL(string: BASE_URL) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in

            // handle error
            if let error = error {
                print("Failed to fetch data with error: ", error.localizedDescription)
                return
            }

            guard let data = data else {return}

            do {
                let myDecoder = JSONDecoder()
                myDecoder.dateDecodingStrategy = .secondsSince1970 // formats date
                let clients = try myDecoder.decode([Client].self, from: data)
                completion(clients.filter { self.calendar.isDateInToday($0.calls.dateTime) // filters dates upon completion
                }) 


            } catch let error {
                print("Failed to create JSON with error: ", error.localizedDescription)
            }
        }.resume()
    }
}

在我的解决方案中,API 调用在过滤之前完成,这不太理想,因为这意味着所有数据都在过滤之前下载,理想情况下我希望在过滤之前过滤数据欢迎下载任何可以为我指明正确方向的人。

此外,此解决方案仅检查日期是否为今天,而不检查日期是否为将来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多