Как бы вы отправляли повторяющиеся HTTP-запросы в Swift? - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я создаю приложение, которое получает финансовые данные 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 Ответ

0 голосов
/ 16 мая 2018

В данный момент я просто тестирую, так что это в конце функции 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...