Я не могу изменить TabBarViewController, когда у меня есть запрос асинхронизации - PullRequest
0 голосов
/ 28 января 2019

Я не могу изменить свое представление до тех пор, пока я не выполню запрос и не найду и не заполню свой объект.

Я попытался поставить асинхронный код в GCD.Это не работает

override func viewDidLoad() {
    getHeartStroke()
NotificationCenter.default.addObserver(forName:NSNotification.Name("HeartStrokeNotification"), object: nil, queue: nil, using: notificationFinish)
 }

 func getHeartStroke() {
AF.request("http://localhost:8080/heartstroke", method: .get, headers: nil).responseJSON(completionHandler: {response in
    if (response.error == nil)
    {
        let json = JSON(response.result.value!)
            DispatchQueue.global(qos: .userInitiated).async {
                guard let hearstrokeArray = try? JSONDecoder().decode([HeartStroke].self, from: json.rawData()) else{
                    debugPrint("An error has occurred")
                    return
                }
                NotificationCenter.default.post(name:NSNotification.Name("HeartStrokeNotification"), object: hearstrokeArray, userInfo: nil)
            }
        }else{
            NotificationCenter.default.post(name:NSNotification.Name("HeartStrokeErrorNotification"), object: nil, userInfo: nil)
        }
    })
 }

 func notificationFinish(notification:Notification) -> Void{
  if (notification.name.rawValue == "HeartStrokeNotification"){

    arrayHeartstroke = notification.object as! [HeartStroke]
    DispatchQueue.main.async(execute: {
        self.tableView.reloadData()
    })
}

С этим кодом я остаюсь заблокированным на своей странице до конца getHeartStroke (), я ожидаю, что я буду перемещаться в моем приложении в то же время при получении.

1 Ответ

0 голосов
/ 28 января 2019

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

func getHeartStroke(completionHandler: (_ heartStroke: [HeartStroke?], _ error: NSError?) -> ()) {
    AF.request("http://localhost:8080/heartstroke", method: .get, headers: nil).responseJSON(completionHandler: {response in
        if (response.error == nil)
        {
            let json = JSON(response.result.value!)
            DispatchQueue.global(qos: .userInitiated).async {
                guard let hearstrokeArray = try? JSONDecoder().decode([HeartStroke].self, from: json.rawData()) else{
                    debugPrint("An error has occurred")
                    return
                }
                completionHandler(hearstrokeArray, nil)
            }
        } else {
            completionHandler(nil, response.error))
        }
    })
}

Затем вы можете назвать его так:

getHeartStroke { [weak self] (heartStrokeArray, error) in
     guard let self = self else {return}
        if error != nil {
            self.processError(error)
        } else {
            self.processHeartStroke(heartStrokeArray)
        }
    }

processError и processHeartStroke будут функциями, которые вы должны создать для обработки объектов heartStrokeArray и error.

Это стандартные обратные вызовы или передача функций в функции.Многие курсы, которые вы находите в Интернете, похоже, игнорируют обратные вызовы, но определенно стоит потратить на них время.

Подробнее о замыканиях (завершениеHandler, как его здесь называют) можно узнать здесь: https://docs.swift.org/swift-book/LanguageGuide/Closures.html

...