Как бы вы отправляли повторяющиеся 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
}
Другие вопросы по тегам