无法在列表视图中使用已解析的数据

Cannot use parsed data on list view

我正在发出 JSON 请求并从 api 得到一些回应, 我正在解析它,但是优先级对我来说是个问题。

首先我用 alamofire 发送 .post,

其次我得到一些响应并用 swiftyjson 解析它

第三次尝试在列表视图上使用已解析的数据,但列表视图在解析之前先工作,并且 returns 空列表视图

我尝试将函数放在 viewdidload 的第一行, 我尝试在 viewdidload 中编写 Alamofire 和 swiftyjson 部分。

但其中 none 起作用,每次 listviews numberofrowinsection 函数首先起作用。

我无法使用我的助手 class 或任何静态变量,因为我持有信用卡数据,我不想为此造成一些安全问题。

import UIKit
import CreditCardForm
import Alamofire
import SwiftyJSON

class CreditCardScreen: UIViewController, UITableViewDelegate , UITableViewDataSource {
    var json: JSON = []
    var data: JSON = []
    var token: Parameters = [
        "token": Helper.token,
        "page_index": "0",
        "page_size": "20"
    ]


    @IBOutlet weak var creditCardTableView: UITableView!
    @IBOutlet weak var creditCardView: CreditCardFormView!


    override func viewDidLoad() {
        super.viewDidLoad()
        getCreditCardsFromApi()
        creditCardView.isHidden = true
        creditCardTableView.delegate = self
        creditCardTableView.dataSource = self
        creditCardTableView.separatorStyle = .none


        //creditCardView.changer(value:"10/20")

        // Do any additional setup after loading the view.
    }

    @IBAction func unCreditCardScreen(_ sender: UIStoryboardSegue) {
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.data.count // everytime this line works before than api parsing
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{


        let cell = Bundle.main.loadNibNamed("CreditCardIndexPage", owner: self, options: nil)?.first as! CreditCardIndexPage

        let selectedCard = data[indexPath.row]
        cell.cardHolderName = selectedCard["card_name"].stringValue
        //cell.cardHolderName = isimler[indexPath.row]
        cell.cardNumber = "4242424242424240"
        cell.backgroundColor = UIColor.clear
        cell.write()
        return cell


    }
    func getCreditCardsFromApi(){
        Alamofire.request("\(Helper.mainApi)/api/getPaymentCards", method: .post, parameters: token, encoding: JSONEncoding.default).responseJSON{response in
            switch response.result{
            case .success(let value):
                self.json = JSON(value)
                self.data = self.json["data"]




            case .failure(let error):
                print(error.localizedDescription)

            }
        }

}


}

没有错误消息,但我试图通过断点查看哪个先工作,tableview 函数总是在声明变量后工作。

HTTP 请求需要时间。在加载 table 视图之前,它们不可能完成。正确的做法是在获得数据后重新加载 table 视图:

func getCreditCardsFromApi(){
    Alamofire.request("\(Helper.mainApi)/api/getPaymentCards", method: .post, parameters: token, encoding: JSONEncoding.default).responseJSON{response in
        switch response.result{
        case .success(let value):
            self.json = JSON(value)
            self.data = self.json["data"]
            self.tableView.reloadData() <--- this line!

        case .failure(let error):
            print(error.localizedDescription)

        }
    }

numberOfCellsInSection 仍将首先调用,但会在您收到响应后第二次调用