JSON не может получить данные в таблицу SQLite3 - PullRequest
0 голосов
/ 22 октября 2018

Я видел довольно много постов по этому вопросу, и, похоже, ни один не отвечает на мой вопрос.Они, как правило, гораздо сложнее, чем я спрашиваю.У меня есть список из одной или нескольких акций, по которым я хотел бы получить последнюю цену из Интернета.Я нашел хороший 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
}

Я пробовал несколько вариантов функций идействия и переменные, но моя последняя попытка, которая еще не приблизилась к работе, выполняется в моем viewDidLoad моего ViewController, где я делаю некоторые начальные настройки:

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 делегата, я обновляю экран.Но я искал бэкэнд-процесс, чтобы сделать несколько вызовов 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, особенно в торговый день и в периоды высокой активности и потенциальной задержки в сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...