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

时间:2019-08-05 01:57:55

标签: swift listview alamofire swifty-json viewdidload

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

首先,我用alamofire发送.post,

第二秒钟我得到一些响应,并使用swiftyjson对其进行解析

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

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

但是它们都不起作用,每次listviewsrowingsection函数首先起作用。

我不能与此一起使用我的助手类或任何静态变量,因为我持有信用卡数据,并且我不希望与此产生一些安全问题。

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函数。

1 个答案:

答案 0 :(得分:1)

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

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仍将首先被调用,但是在收到响应后将再次被调用