Swift函数在Json Decoder完成后无法继续运行-“ else if”问题?

时间:2019-10-12 07:51:11

标签: swift

我正在使用此函数从数据库中调用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 :(得分:0)

如果有人知道更好的答案,那就希望听听。

我在代码中添加了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)