Разбор данных SwiftyJSON и Alamofire в TableView (iOS, Swift 4) - PullRequest
0 голосов
/ 12 июня 2018

Когда я запускаю свой проект, я просто могу получить только tableView, но данные не считаются пустыми.Структура codable и коды контроллера представления были следующими.Пожалуйста, помогите мне в просмотре данных в моих tableView ячейках с использованием alamofire и 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, swift4.

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Во-первых, ваш ...

struct codable

... вообще не является структурой, это класс.изменить это на фактическую структуру.

Во-вторых, вы начинаете загрузку до того, как ваш делегат и источник данных настроены на просмотр таблицы.

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 s у вас будет в вашей таблице, у вас будут проблемы с загрузкой ваших изображений.Завершения не гарантированно завершаются по порядку, но когда они это сделают, они обновят ячейку независимо от того, используется ли ячейка повторно для другой Load или нет.Просто к вашему сведению.

0 голосов
/ 12 июня 2018

данные не извлекаются пустыми

Ваш код не обновляется 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 ответа и ваш исходный код в целом, так что это может быть не ответ каталога на ваш вопрос, но я надеюсь, что это поможет!

0 голосов
/ 12 июня 2018

На первый взгляд, URL выглядит неверно для меня.https набирается дважды, пожалуйста, удалите один раз в строке ниже.

Измените это:

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

на:

Alamofire.request("https://alot.ae/api/classifiedcomputerlaptop.php").responseJSON
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...