TableView(iOS,Swift 4)中的SwiftyJSON和Alamofire数据解析

时间:2018-06-12 09:06:14

标签: ios swift phpmyadmin swift4

当我运行我的项目时,我只能得到tableView,但数据不会被取为空白。结构codable和视图控制器代码如下。请帮助我使用tableViewalamofire查看SwiftyJSON单元格中的数据,

class Loads: Codable {
    let loads: [Load]
    init(loads: [Load]) {
        self.loads = loads
    }
}

class Load: Codable {
    let id: String
    let ad_title: String
    let ad_description:String
    let ad_price: String
    let ad_post_date: String
    let image1: String

    init(ad_title: String, ad_description: String, ad_price: String, ad_post_date: String, image1: String) {
        self.ad_title = ad_title
        self.ad_description = ad_description
        self.ad_price = ad_price
        self.ad_post_date = ad_post_date
        self.image1 = image1

    }
}

查看控制器代码:

import UIKit
import SwiftyJSON
import Alamofire

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var loads = [Load]()
    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        downloadJson()
        self.tableView.reloadData()
        tableView.delegate = self
        tableView.dataSource = self
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection
        section: Int) -> Int {
        return loads.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath:
        IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "LoadCell") as? LoadCell else { return UITableViewCell() }

        cell.labelA.text = loads[indexPath.row].ad_title
        cell.labelB.text = loads[indexPath.row].ad_price
        cell.labelC.text = loads[indexPath.row].ad_description
        cell.labelD.text = loads[indexPath.row].ad_post_date
        if let imageURL = URL(string: loads[indexPath.row].image1) {
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: imageURL)
                if let data = data {
                    let image = UIImage(data: data)
                    DispatchQueue.main.async {
                        cell.loadImage.image = image
                    }
                }
            }
        }
        return cell    
    }

    func downloadJson(){
        Alamofire.request("https://alot.ae/api/classifiedcomputerlaptop.php").responseJSON { response in

            if let value = response.result.value {

                let json = JSON(value)

                //Printing strings from a JSON Dictionary
                print(json[0]["ad_title"].stringValue)
                print(json[0]["ad_price"].stringValue)
                print(json[0]["ad_description"].stringValue)
                print(json[0]["ad_post_date"].stringValue)
                print(json[0]["image1"].stringValue)
            }
          self.tableView.reloadData()
          }
        self.tableView.reloadData()
    }
 }

我正在使用xcode9,swift 4。

3 个答案:

答案 0 :(得分:1)

  

数据未获取其空白

您的代码似乎没有通过下载的数据更新var loads,这就是您获得空白表格视图的原因。因此,您需要将提取的数据分配给var loads

以下是样本:

Alamofire.request("https://alot.ae/api/classifiedcomputerlaptop.php").responseJSON { response in 
    // you should assign response data into var loads here 
    if let data = response.data {
            do {
                self.loads = try JSONDecoder().decode([Load].self, from: data)
            } catch {
                // exception
            }
    }
}

之后,self.tableView.reloadData()

PS:当然我不知道您的回复JSON格式和整体源代码,所以它可能不是您的问题的目录答案,但我希望它会有所帮助!

答案 1 :(得分:0)

乍一看,网址看起来很糟糕。 <div id= "row" class="Row"> <label>Row1:</label> <div id= "CCol1" class="CCol"> <input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth"> </div> <div id= "CCol2" class="CCol"> <input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth"> </div> <div id= "CCol3" class="CCol"> <input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth"> </div> <div id= "CCol4" class="CCol"> <input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth"> </div> <div id= "CCol5" class="CCol"> <input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth"> </div> </div>输入两次,请在下方删除一次。

改变这个:

https

到:

Alamofire.request("https:https://alot.ae/api/classifiedcomputerlaptop.php").responseJSON

答案 2 :(得分:0)

首先,你的......

  

struct codable

...根本不是结构,它是一个类。将其更改为实际的结构。

其次,在委托和数据源设置为tableview之前开始下载。

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate   = self
    tableView.dataSource = self
    downloadJson()
}

第三,您正在使用Alamofire进行简单的GET请求,但是您忽略了使用Data对单元格进行异步加载图像的事实。我建议一起使用AlamoFireImageDownloader或远程AlamoFire。使用URLSession同样简单:

private func request(url: URL, completionHandler: @escaping ((Data?, URLResponse?, Error?) -> Void)) {
    var request = URLRequest(url: url)
    request.httpMethod = "GET"

    let task = URLSession.shared.dataTask(with: request, completionHandler: completionHandler)
    task.resume()
}

第四,我不相信你需要loads可编码。

只是额外提醒,根据您在桌面上的Load数量,您将遇到加载图片的问题。闭包不能保证按顺序完成,但是当它们这样做时,它们将更新单元格,无论单元格是否已经被重用于另一个Load。仅供参考。