我已经看到很多关于这个问题的帖子,而且似乎都没有人回答我的问题。它们通常比我要问的要复杂得多。我列出了一个或多个我想从互联网上获取最新价格的股票。我找到了一个不错的API,很高兴创建一个简单的结构并完成URLSession的基础。我能够将数据提取到我的结构化格式中,并在控制台中毫无问题地打印出来。例如:
Quote(symbol: "C", companyName: "Citigroup Inc.", latestPrice: 68.86)
我想用当前价格更新我的SQLite3数据库记录。我无法获取数据。
所以我有一个基于模型的opentrades数组:
class OpenTradeDur: NSObject {
@objc dynamic var trNo: Int
@objc dynamic var trPDate: String
@objc dynamic var trTicker: String
@objc dynamic var trDur: String
@objc dynamic var trCurPrice: Double
并且Quote结构很简单:
struct Quote: Decodable {
let symbol: String
let companyName: String
let latestPrice: Double
}
我已经尝试了函数,动作和变量的多种变体,但是我仍然无法接近的最新尝试是在ViewController的viewDidLoad中进行的,其中我做了一些初始设置:
for _ in opentrades {
rn = rn + 1
let url = URL(string: "https://api.iextrading.com/1.0/stock/\(opentrades[rn].trTicker)/quote")
let session = URLSession.shared
let task = session.dataTask(with: url!) {(data, response, error) in
guard let data = data else { return }
do {
let quote = try JSONDecoder.decode(Quote.self,from: data)
print(quote)
self.opentrades[rn].trCurPrice = quote.latestPrice
} catch {}
}
task.resume()
}
我发现了几篇关于完成处理程序的文章,但即使在这些示例中,也仅给出了最终打印到控制台的答案。我只需要一个简单的实现。我真正需要的是一个我可以调用并说出的功能:
price = getPrice(stockTicker)
例如price = getPrice("C")
,以及从
获取JSON数据时的幕后操作https://api.iextrading.com/1.0/stock/C/quote
有人能指出我正确的方向吗?
[2018-10-25]
通过在执行URLSession的类中创建委托协议,然后使用委托扩展ViewController,我设法以某种方式使其工作。这一次只适用于单引号。我可以使用一个按钮来启动该过程,当数据通过委托的didLoad函数返回时,我会更新屏幕。但是我一直在寻找一个后端处理程序来多次调用quote api并更新多个记录。但是我无法使它同步。但是我有一个想法,回到API文档后发现了一个批处理调用,在此我可以在一次调用中返回多只股票的所有数据。这正是我所需要的,但是我再次陷入困境。返回的数据是JSON数据,但不符合jsonapi.org。我将把它发布为一个新问题,并在提出这个问题时努力使之有意义。
编辑:我的新问题收到了很好的答复,它已经解决了我在这里遇到的问题,因此我将提供更新。
正如我之前试图解释的那样,我的应用程序在启动时会遍历所有未平仓交易,并希望更新每笔交易的最新价格。我有一个数组可以设置价格,然后更新数据库以保存这些更改。然后,我的应用程序打开,并显示新数据。
我现在有一个函数,该函数将股票代码作为输入并立即返回价格...
func getPrice(ticker: String) -> Double {
var price = 0.0
let urlString = "https://api.iextrading.com/1.0/stock/\(ticker)/quote"
let data = try! Data(contentsOf: URL(string: urlString)!)
do {
let response = try JSONDecoder().decode(Quote.self,from: data)
price = response.latestPrice
} catch let jsonErr { print("Error decoding JSON:",jsonErr)}
return price
}
我只是简单地遍历所有交易并设定价格...
opentrades[rn].trCurPrice = getPrice(ticker: opentrades[rn].trTicker)
我将对此进行测试,以查看在不使用URLSession的情况下如何工作,尤其是在交易日以及活动量大和潜在的网络延迟期间。