Полоса Alamofire JSON не заполняет массив - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь заполнить UITableView списком кредитных карт в Stripe. Я знаю, что это работает для моей тестовой среды, потому что я могу видеть ответ JSON от Почтальона. Это почему-то не заполняет мою таблицу.

Поскольку это [Любой объект], мне не нужно создавать отдельный класс с инициализацией? У меня есть другие таблицы в моем приложении, заполняющие данные и обновленные UILabels после извлечения информации из FireBase.

Вот код в контроллере представления PaymentsVC.swift:

class PaymentVC: UIViewController, UITableViewDelegate, UITableViewDataSource {


    @IBOutlet var headerView: UIView!
    @IBOutlet var cardsTableView: UITableView!
    @IBOutlet var cardTextField: STPPaymentCardTextField!

    var stripeTool = StripeTools()
    static let sharedClient = MyAPIClient()

    //var customerId: String?
    let customerId = "mycusid"

    var baseURLString: String? = "https://api.sripe.com/v1/customers"
    var baseURL: URL {
        if let urlString = self.baseURLString, let url = URL(string: urlString) {
            return url
        } else {
            fatalError()
        }
    }

    var stripeUtil = StripeUtil()
    var cards = [AnyObject]()



    override func viewDidLoad() {
        super.viewDidLoad()


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        //only one section
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return self.cards.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let url = self.baseURL.appendingPathComponent("\(self.customerId)/sources?object=card")
        let headers = ["Authorization": self.stripeTool.getBasicAuth()]
        Alamofire.request(url, headers: headers)
            .validate(statusCode: 200..<300)
            .responseJSON { response in
                switch response.result {
                case .success(let result):
                    if let cards = STPCustomer.decodedObject(fromAPIResponse: result as? [String: AnyObject]) {
                        print(cards)
                    //    completion(cards, nil)
                    } else {
                    //    completion(nil, NSError.customerDecodingError)
                    }
                case .failure(let error): break
                   // nil, error
                }
        }


        //get card cell with cardCell identifier don't forget it on your storyboard
        let cell = tableView.dequeueReusableCell(withIdentifier: "cardCell") as! CardCell

        //get the last4 value on the card json, create the string and pass it to the label
        if let last4 = self.cards[indexPath.row]["last4"] {
            cell.cardNumberLabel.text = "**** **** **** \(last4!)"
        }

        //get the month/year expiration values on the card json, create the string and pass it to the label
        if let expirationMonth = self.cards[indexPath.row]["exp_month"], let expirationYear = self.cards[indexPath.row]["exp_year"] {
            cell.expirationLabel.text = "\(expirationMonth!)/\(expirationYear!)"
        }
        return cell
    }

1 Ответ

0 голосов
/ 03 ноября 2018

Не помещайте вызовы API внутри cellForRowAt, так как он будет вызываться при каждом создании / снятии очереди с ячейки, вам нужно поместить этот код в viewDidLoad с перезагрузкой таблицы

let url = self.baseURL.appendingPathComponent("\(self.customerId)/sources?object=card")
let headers = ["Authorization": self.stripeTool.getBasicAuth()]
Alamofire.request(url, headers: headers)
    .validate(statusCode: 200..<300)
    .responseJSON { response in
        switch response.result {
        case .success(let result):
            if let cards = STPCustomer.decodedObject(fromAPIResponse: result as? [String: AnyObject]) {
                print(cards)
                self.cards = cards
                self.cardsTableView.reloadData()
            //    completion(cards, nil)
            } else {
            //    completion(nil, NSError.customerDecodingError)
            }
        case .failure(let error): break
           // nil, error
        }
}

не забудьте установить в viewDidLoad

 self.cardsTableView.delegate = self
 self.cardsTableView.dataSource = self
...