Функция Swift не продолжается после завершения Json Decoder внутри - «еще, если» проблема? - PullRequest
1 голос
/ 12 октября 2019

Я использую эту функцию для вызова информации json из базы данных - она ​​получает информацию в порядке.

Но она не продолжается после «getHistoricalMonthlyData». поэтому он не попадет на печать («****** строка 55»). (да, я планирую сделать эту функцию, как только выясню проблему.)

она напечатает отлично "print (i.stock)".

Я могу поделиться "getHistoricalMonthlyData"код, но он работает нормально, и я сомневаюсь, что это проблема.

Я не очень хорош с обработчиками завершения, и я подозреваю, что это проблема?

ниже приведена функция" getHistoricalMonthlyData ", котораяЯ не могу пройти мимо.

func calculateMonthPerformance (setting: settings) {

    let set = setting
    let u = User.getUser()
    var i = Indexes()


      getHistoricalMonthlyData(symbol: symbol, beg: set.monthBeg, end: set.monthEnd) { (json, error ) in

            if let error = error {
                print ("error", error)

            } else if let  json = json {
                print ("success")
                i.stock = json
                print(47)
            }

          // this is fine
          print(50)
          print(i.stock)

        }

     // nothing at this point
     print("****** line 55")

 }

Так настроена функция json и она отлично работает в другом проекте.

у нее есть резюме.

 func getHistoricalMonthlyData(symbol: String, beg: Date, end: Date, completionHandler: @escaping ([HistoricalData]?, Error?) -> Void) {

let beg = beg.dateAtStartOf(.month).toFormat("yyyy-MM-dd")
let end = end.dateAtEndOf(.month).toFormat("yyyy-MM-dd")

let jsonUrl = "https://eodhistoricaldata.com/api/eod/\(symbol).US?from=\(beg)&to=\(end)&api_token=\(EOD_KEY)&period=eom&fmt=json"


guard let url = URL(string: jsonUrl) else {
    print("Error: cannot create URL")
    let error = BackendError.urlError(reason: "Could not create URL")
    completionHandler(nil, error)
    return
}

URLSession.shared.dataTask(with: url) { (data, response, error) in

    guard error == nil else {
        completionHandler(nil, error!)
        return
    }

    guard let jasonData = data else {
        print("Error: did not receive data")
        let error = BackendError.objectSerialization(reason: "No data in response")
        completionHandler(nil, error)
        return
    }

    do {

        let historical = try JSONDecoder().decode([HistoricalData].self, from: jasonData )

        completionHandler(historical, nil)

    } catch let jsonErr {
        print ("Error serializing json", jsonErr )
        let error = BackendError.objectSerialization(reason: "Couldn't create a todo object from the JSON")
        completionHandler(nil, error)

    }

}.resume()

}

спасибо.

1 Ответ

0 голосов
/ 13 октября 2019

, если кто-то знает лучший ответ, хотел бы услышать об этом.

Я добавил DispatchSemaphore к коду, и он, кажется, работает.

ура.

let semaphore = DispatchSemaphore(value: 0)

URLSession.shared.dataTask(with: url) { (data, response, error) in

    guard error == nil else {
        completionHandler(nil, error!)
        return
    }

    guard let jasonData = data else {
        let error = BackendError.objectSerialization(reason: "No data in response")
        completionHandler(nil, error)
        return
    }

    do {

        let historical = try JSONDecoder().decode([HistoricalData].self, from: jasonData )

        completionHandler(historical, nil)

    } catch let jsonErr {
        let error = BackendError.objectSerialization(reason: "Couldn't create a todo object from the JSON")
        completionHandler(nil, error)

    }

    semaphore.signal()

}.resume()

_ = semaphore.wait(timeout: .distantFuture)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...