【问题标题】:Why is swift's JSONDecoder.decode(_:from:) taking 10-15 seconds for just 1mb data?为什么 swift 的 JSONDecoder.decode(_:from:) 只需 1mb 数据就需要 10-15 秒?
【发布时间】:2020-05-16 23:39:44
【问题描述】:

我正在使用 swift 的 JSONDecoder 来解码大约 1mb 的 JSON 数据。我的 JSON 有一堆嵌套对象。 我正在使用 init(from decoder:) 解码我的 JSON 数据。问题在于,仅在 API 调用返回成功响应后,解码 JSON 大约需要 10-15 秒。为什么会发生这种情况(我的数据量不是很大)? 另外,我怎样才能减少这个时间?

我正在 iPhone 6 和 Xcode 模拟器上进行测试。 API 调用大约需要 1-2 秒来获取 JSON。

我正在使用Moya 这是我的 api 调用示例:

API.provider.request(API.getDetails(id: courseID), completion:  { [weak self] result in
        switch result {
        case .success(let response):
            do {
                var results = try JSONDecoder().decode(MiniDetailApiResponse.self, from: response.data)
                delegate?.success(results)
              }catch{
                 delegate?.failure()
              }
}

【问题讨论】:

  • 显示你正在点击的代码或 api >?
  • 是的,如果没有相关代码,这个问题是无法回答的。
  • @JoakimDanielson 我编辑了我的问题描述并添加了我的 API 调用示例。我无法分享实际的代码结构,但我希望这会有所帮助。
  • @jawadAli 我已经编辑了描述,请看一下。附言忽略该开关并非详尽无遗。这只是一个示例。
  • 因为 API 调用不是问题,所以这不是很有帮助。也许您可以在结构中添加一些带有时间戳的打印语句,以尝试找出慢的部分。

标签: ios json swift iphone jsondecoder


【解决方案1】:

从 JSON 解码可能不会花费那么长时间,除非您在自定义 init(from: Decoder) 中做一些非常有趣的事情,但您的问题中没有包含来自 MinDetailApiResponse 的任何内容,所以很难说。

如果您的 10-15 秒数字来自您等待屏幕上的某些内容发生变化,那么最可能的原因是上面的 API 请求调用没有在主线程上被调用,这通常显示为UI 更新延迟很长。

在上面的var results = try... 上放一个断点,当它被击中时,查看调试导航器 - 你在主线程上吗?

如果没有,你应该在主线程上调用你的委托方法:

DispatchQueue.main.async { delegate?.success(results) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多