我目前正在创建一个应用程序,每隔十秒就会从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请求需要不断发送并在视图控制器更改后立即停止发送
答案 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
}