Разобрал JSON долго не обновлялся по вызову api - PullRequest
0 голосов
/ 06 апреля 2019

По какой-то причине объект JSON, полученный при разборе, не обновляется после сетевых вызовов и API, которые мы создали. Я проверяю конечную точку, и теперь факт обновляется сразу же. У меня есть таймер, который вызывается каждые 10 секунд, чтобы сделать вызов, но проанализированный json не обновляется примерно через минуту или около того. Я попытался положить его в основной поток, и это все еще не работает. Вот мой код:

@objc func getLaunches() {

    let simulator = UserDefaults.standard.string(forKey: self.launchSimulator)
    if(simulator == self.password){
        print("they are the same")
    }

    guard let launchUrl = URL(string: launchesURL) else {
        return
    }
    let request = URLRequest(url: launchUrl)
     DispatchQueue.main.async { [weak self] in
    let task = URLSession.shared.dataTask(with: request, completionHandler: {
        (data, response, error) -> Void in
        if let error = error {
            print(error)
            return
        }
        // Parse JSON data

        if let data = data {

            self?.launches.removeAll()
            self?.launches = (self!.parseJsonData(data: data))
            let nextlaunch = self?.launches[0]
            // Reload table view



                self?.hours = nextlaunch?.time
                self?.yearMonth = nextlaunch?.date
                var fulltime = self?.yearMonth

                fulltime!.insert("-", at: fulltime!.index(fulltime!.startIndex, offsetBy: 4))
                fulltime!.insert("-", at: fulltime!.index(fulltime!.startIndex, offsetBy: 7))
                fulltime = fulltime! + " "
                fulltime = fulltime! + self!.hours

                let fullFormatter = DateFormatter()
                fullFormatter.dateFormat = "YYYY-MM-dd HH:mm"
                fullFormatter.timeZone = TimeZone(abbreviation: "EST")
                self?.launchDate = fullFormatter.date(from: fulltime!)


                self?.getCountdown()


        }


    })
    task.resume()
    }

}


//parse launch info from json to dictionary into launches object
func parseJsonData(data: Data) -> [NextLaunch] {
    var launches = [NextLaunch]()

    do {
        let jsonResult = try JSONSerialization.jsonObject(with: data, options:
            JSONSerialization.ReadingOptions.allowFragments) as? NSDictionary


        let jsonLaunches = jsonResult?["launches"] as! [NSDictionary]
        for jsonLaunch in jsonLaunches {
            let launch = NextLaunch()
            launch.date = jsonLaunch["date"] as! String
            launch.time = jsonLaunch["time"] as! String
            if(launch.time == ""){
                launch.time = "00:00"
            }
            launch.mission = jsonLaunch["mission"] as! String
            launch.launchpad = jsonLaunch["launch_pad"] as! String
            launch.image = jsonLaunch["image"] as! String
            launch.delay = jsonLaunch["delayed"] as! String

            //show delay image if it is delayed
            if(launch.delay == "1"){
                self.delayed()
            }else{
                self.notDelayed()
            }

            launches.append(launch)
        }
    } catch {
        print(error)
    }

    return launches

}

1 Ответ

0 голосов
/ 06 апреля 2019

Вам нужно

DispatchQueue.main.async {
   self?.getCountdown()
}

Поскольку ответ URLSession.shared.dataTask(with: происходит в фоновом потоке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...