gpt4 book ai didi

完成 Json 解码器后 Swift 函数不继续 - "else if"问题?

转载 作者:行者123 更新时间:2023-11-28 07:20:26 25 4
gpt4 key购买 nike

我正在使用此函数从数据库中调用 json 信息 - 它可以很好地获取信息。

但它不会在“getHistoricalMonthlyData”之后继续。所以它不会打印出来(“****** line 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()

}

谢谢。

最佳答案

如果有人知道更好的答案,很乐意听听。

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

关于完成 Json 解码器后 Swift 函数不继续 - "else if"问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58352040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com