我正在发出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函数。
答案 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
仍将首先被调用,但是在收到响应后将再次被调用 。