无法将 JSON 响应分配给预先声明的数组

Posted

技术标签:

【中文标题】无法将 JSON 响应分配给预先声明的数组【英文标题】:Cannot assign JSON response to a pre-declared array 【发布时间】:2017-02-01 15:57:37 【问题描述】:

我正在使用 Swift 开发一个爱好项目 ios 应用程序,以学习在 Moya 中使用 JSON。这是我的 VC 代码的样子:

import UIKit
import Moya
import Moya_ModelMapper

class SQSquirrelListViewController: UIViewController 

  @IBOutlet weak var tableView: UITableView!

  var squirrels: [Squirrel] = []

  override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    self.fetchData()
  


  override func viewDidLoad() 
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
  

  func fetchData() 
    let provider = MoyaProvider<SQService>()
    provider.request(.squirrelsIndex(page: "1"))  result in
      switch result 
      case let .success(moyaResponse):
        do 
          let sq = try moyaResponse.mapObject() as Squirrels
          self.squirrels = sq.items
         catch 
          print(error.localizedDescription)
        
        let statusCode = moyaResponse.statusCode
        print("STATUS CODE: \(statusCode)")
      case let .failure(error):
        print(error.localizedDescription)
      
    
    tableView.reloadData()
  

启动应用程序后,squirrels 数组为空。我不确定它是否与 Moya 有关,还是我的 View Controller 流程​​中的缺陷?

【问题讨论】:

控制台中是否打印了任何内容? @hybridcattt 只有状态码,如 fetchData() 中的 print 语句。调试器中的数组为空,当我尝试在表视图的数据源方法中使用 squirrels[indexPath.row] 时,也会抛出“数组索引越界”。 尝试在self.squirrels = sq.items 中设置一个断点,看看sq 中的内容。同时打印try moyaResponse.mapObject() - 这很可能是空的。 @hybridcattt 打印 self.squirrels 返回正确的值。问题出在@vadian 指出的问题上——在完成处理程序中移动self.tableView.reloadData() 解决了这个问题。 @vadian - 请回复,以便我接受您的回答。感谢你们的参与和帮助我学习。 【参考方案1】:

重新加载表格视图的行必须完成处理程序中。

【讨论】:

以上是关于无法将 JSON 响应分配给预先声明的数组的主要内容,如果未能解决你的问题,请参考以下文章

将 Ajax 响应分配给 php 变量

如何将从webapi返回的自定义对象数组的HttpResponse响应分配给打字稿角度中相同数组类型的对象?

在将查询响应分配给模型字段时丢失大量的ember-data类属性

Vue 旧阵列镜像新阵列

使用 JSON 响应快速调用函数时出错

lumen 6:如何在 lumen 上重构响应分页的数据?