Как бы вы отправляли повторяющиеся HTTP-запросы в Swift?
В настоящее время я создаю приложение, которое получает финансовые данные OHLC (открытое, высокое, низкое, закрытое) из запроса http каждые десять секунд.
Моя функциональность для запроса http содержится в обработчике завершения запроса http следующим образом:
HTTPRequest.requestOHLC(symbol: "XBTUSD") {ohclData in
//do something
}
Я пытаюсь выяснить лучший способ отправки повторных запросов в фоновом режиме
Я попытался настроить цикл while с 10-секундной задержкой следующим образом:
while(true) {
HTTPRequest.requestOHLC(symbol: "XBTUSD"){ ohclData in
//do something
}
sleep(10)
}
Это не работает, я считаю, потому что либо HTTP-запрос является асинхронным, либо функция сна делает больше, чем я понимаю. Если кто-нибудь знает правильный способ сделать это, это было бы очень полезно, так как я совсем новичок в использовании интернет-протоколов. Кажется, это должно быть довольно легко сделать. Способ использования этого приложения, когда текущий контроллер представления открыт, необходимо постоянно отправлять http-запрос и прекращать отправку, как только изменяется контроллер представления.
1 ответ
В данный момент я просто тестирую, так что это в конце функции viewDidLoad()
Это, вероятно, ваша проблема. sleep
просто приостанавливает текущий поток на указанное количество секунд, а блокировка основного потока - плохая идея. Основной поток - это основной цикл событий вашего приложения, и если этот поток заблокирован, ваше приложение не сможет отвечать на события и будет отображаться как замороженное. Ваши сетевые запросы, вероятно, ожидают в главном цикле событий, который никогда не сможет их обработать, потому что он застрял в ожидании viewDidLoad
заканчивать.
Лучшее решение этой проблемы обычно Timer
, который может запустить код после истечения временного интервала. Вот пример:
// In your view controller:
var ohlcTimer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
//...
ohlcTimer = Timer.scheduledTimer(withTimeInterval: 10, repeats: true) { timer in
HTTPRequest.requestOHLC(symbol: "XBTUSD"){ ohclData in
//do something
}
}
ohlcTimer!.fire() //cause the timer to fire once now -- it's first scheduled firing will happen in 10 seconds
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
ohlcTimer?.invalidate()
ohlcTimer = nil
}