Я получаю сообщение об ошибке при попытке загрузить данные из моего API и отобразить их в TableViewController. Табличное представление пусто. Я не понимаю, в чем дело. В основном я получаю такую ​​ошибку:

2017-11-25 08: 03: 42.775803 ClassDesign [2243: 51810] [] __nwlog_err_simulate_crash_libsystem libsystem имитировать сбой недоступен "libsystem_network.dylib: nw_host_stats_add_src :: получена ошибка для SRC_ADDEDED: [22-11] 2017 г. неверный аргумент: [22-11] : 42.776596 ClassDesign [2243: 51810] [] nw_host_stats_add_src получили ошибку для SRC_ADDED: [22] Недопустимый аргумент, демпинг: [цепочку вызовов x86_64] libnetcore-856.30.16 0 libsystem_network.dylib 0x0000000109060666 __nw_create_backtrace_string + 123 1 libsystem_network.dylib 0x00000001090772f6 nw_get_host_stats + 1083 2 libnetwork.dylib 0x0000000109356e9f nw_endpoint_resolver_start_next_child + 1382 3 libdispatch.dylib 0x0000000108ddd978 _dispatch_call_block_and_release + 12 4 libdispatch.dylib 0x0000000108datchque_dylib 0x0000000108e070cdispatch_dylib 0x0000000108datch_datch_datch_datch_8datch_datch_8cd_datch_datch_8disdatch_datch_datch_4dispatch_datch_5 serial_drain + 236 6 libdispatch.dylib 0x0000000108de5b4b _dispatch_queue_invoke + 1073 7 libdispatch.dylib 0x0000000108de8385 _dispatch_root_queue_drain + 720 8 libdispatch.dylib 0x0000000108de8059 _dispatch_worker_thread3 + 123 9 libsystem_pthread.dylib 0x00000001091ba1ca _pthread_wqthread + 1387 10 libsystem_pthread.dylib 0x00000001091b9c4d start_wqthread + 13 Сообщение от отладчика: Отменено из-за сигнал 15

Мой код для TableViewController:

import UIKit

class ExerciseTableViewController: UITableViewController {

var fetchedExercise = [Exercise]()

override func viewDidLoad() {
    super.viewDidLoad()

    parseData()
}

func parseData() {

    fetchedExercise = []

    let url = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2"
    var request = URLRequest(url: URL(string: url)!)
    request.httpMethod = "GET"

    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)

    let task = session.dataTask(with: request) { (data, response, error) in

        if error != nil {
            print("Error while parsing JSON")
        }
        else {

            do {
                if let data = data,
                    let fetchedData = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any],
                    let exercises = fetchedData["results"] as? [[String: Any]] {

                    for eachExercise in exercises
                    {
                        let name = eachExercise["name"] as! String
                        let description = eachExercise["description"] as! String

                        self.fetchedExercise.append(Exercise(name: name, description: description))

                    }
                    // print(self.fetchedExercise[3].name)
                }
            }
            catch {
                print("Error while parsing data.")
            }
        }
    }
    task.resume()
}


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


// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return fetchedExercise.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "ExerciseCell", for: indexPath) as? ExerciseCell {

        let exercise = fetchedExercise[indexPath.row]
        cell.configureCell(exercise: exercise)

        return cell

    } else {

        return UITableViewCell()
    }


}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

}

}

Также код функции 'configureCell' внутри моего пользовательского класса ячеек выглядит следующим образом:

import UIKit

class ExerciseCell: UITableViewCell {

@IBOutlet weak var nameLbl: UILabel!

var exercise: Exercise!

func configureCell(exercise: Exercise) {

    self.exercise = exercise
    nameLbl.text = self.exercise.name
}

}
0
user7225129 25 Ноя 2017 в 19:11

1 ответ

Лучший ответ

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

Замените закомментированную строку

// print(self.fetchedExercise[3].name)

С участием

DispatchQueue.main.async {
    self.tableView.reloadData()
}

И в этом случае вам не нужен ни URL-запрос для запроса GET по умолчанию, ни конкретный сеанс, потому что вы не используете шаблон делегата.

Однако это не связано с проблемой.

Заменить

let url = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2"
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "GET"

let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request) { (data, response, error) in ...

С участием

let urlString = "https://wger.de/api/v2/exercise/?format=json&language=2&status=2"
let url = URL(string: urlString)!    
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in ...

И, наконец, как всегда, все параметры .mutable... в jsonObject(with в Swift не имеют смысла. Опустите параметр.

0
vadian 25 Ноя 2017 в 16:38