我目前正在创建一个应用程序,每十秒从一个 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 请求是异步的,要么 sleep 函数的作用超出了我的理解。 如果有人知道执行此操作的正确方法,那将非常有帮助,因为我对使用互联网协议(protocol)还很陌生。这看起来应该是一件相当容易做到的事情。 该应用程序的使用方式是,当当前 View Controller 打开时,需要不断发送http请求,并在 View Controller 发生变化时立即停止发送
最佳答案
At the minute, I am just testing so it is at the end of viewDidLoad() function
这可能是你的问题。 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
}
关于swift - 如何在 Swift 中发送重复的 HTTP 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50377494/