JSON无法将数据获取到SQLite3表中

时间:2018-10-21 21:01:12

标签: json swift macos

我已经看到很多关于这个问题的帖子,而且似乎都没有人回答我的问题。它们通常比我要问的要复杂得多。我列出了一个或多个我想从互联网上获取最新价格的股票。我找到了一个不错的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的情况下如何工作,尤其是在交易日以及活动量大和潜在的网络延迟期间。

0 个答案:

没有答案