Запрос Alamofire выполнить после распечатки результата - PullRequest
0 голосов
/ 21 января 2019

Я делаю приложение об использовании API на веб-сайте.Это приложение расписание поездов.И у меня возникли проблемы при отправке данных из одного ViewController в другой.Проблема заключается в том, что созданная мной глобальная переменная (trainNo) не передавалась другому VC при выполнении кода «self.trainNo.append (data2.intValue)» и «prepare (...)».Я использую оператор печати для отладки.Я обнаружил, что при нажатии кнопки сначала выполняется оператор print «print (self.trainNo)» из оператора запроса Alamofire, а затем «print (self.trainNo)» в запросе Alamofire.Я не знаю, почему это происходит.

Я пытался использовать оператор print в другом месте.

@IBAction func buttonPressed(_ sender: Any) {


    APIUrl = "https://ptx.transportdata.tw/MOTC/v2/Rail/TRA/DailyTimetable/OD/"+"\(startStationNo)"+"/to/"+"\(endStationNo)"+"/"+"\(selectedDate)"+"?$top=30&$format=JSON&$orderby=OriginStopTime/ArrivalTime"

    let request = setUpUrl(APIUrl: APIUrl)

    print("\(APIUrl)")

    Alamofire.request(request).responseJSON { response in
        do{
            let json: JSON = try JSON(data: response.data!)

            if let result = json.array {
                for data in result {

                    let data2 = data["DailyTrainInfo"]["TrainNo"]
                    self.trainNo.append(data2.intValue)
                    print(self.trainNo)

                }
            }
            else{
                print("ERROR in data2")
            }

        }
        catch{
            print("ERROR in json \(error)")
        }
    }
    print(self.trainNo)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.destination is TimeTableController {
        let vc = segue.destination as? TimeTableController
        vc?.trainNo = self.trainNo
        print(self.trainNo)
    }
}

Я ожидал, что значение trainNo будет изменено и передано другому VC.но это не сработало.

фактический результат:

[] // это «print (self.trainNo)» в кнопке

[] // thisодин из них «print (self.trainNo)» при подготовке

[101] ...... [101, 3147, 371, 3157, 3167, 1] // это «print» (self.trainNo) "цикл в Alamofire

, что означает, что запрос и цикл Alamofire выполняются после операторов печати, и я понятия не имею, что происходит.

1 Ответ

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

Поскольку запрос асинхронный, вам нужно использовать self.performSegue(withIdentifier внутри обратного вызова

@IBAction func buttonPressed(_ sender: Any) {


    APIUrl = "https://ptx.transportdata.tw/MOTC/v2/Rail/TRA/DailyTimetable/OD/"+"\(startStationNo)"+"/to/"+"\(endStationNo)"+"/"+"\(selectedDate)"+"?$top=30&$format=JSON&$orderby=OriginStopTime/ArrivalTime"

    let request = setUpUrl(APIUrl: APIUrl)

    print("\(APIUrl)")

    Alamofire.request(request).responseJSON { response in
        do{
            let json: JSON = try JSON(data: response.data!)

            if let result = json.array {
                for data in result {

                    let data2 = data["DailyTrainInfo"]["TrainNo"]
                    self.trainNo.append(data2.intValue)
                    print(self.trainNo)

                }

                // this will trigger the segue
                self.performSegue(withIdentifier: "segueName", sender: nil)
            }
            else{
                print("ERROR in data2")
            }

        }
        catch{
            print("ERROR in json \(error)")
        }
    }
    print(self.trainNo)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.destination is TimeTableController {
        let vc = segue.destination as? TimeTableController
        vc?.trainNo = self.trainNo
        print(self.trainNo)
    }
}

и подключите источник перехода к самому виртуальному каналу, а не к кнопке. Кроме того, перед запросом может потребоваться отображение индикатора активности в качестве хорошего UX, поэтому пользователь ожидает, что это сетевая операция

...