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