你会如何在Swift中发送重复的HTTP请求?

时间:2018-05-16 18:10:43

标签: swift rest http httprequest

我目前正在创建一个应用程序,每隔十秒就会从http请求中获取OHLC(开放,高,低,收盘)财务数据。

我对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 :(得分:2)

  

在那一刻,我只是测试所以它在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
}