【问题标题】:How would you send repeating HTTP requests in Swift?你将如何在 Swift 中发送重复的 HTTP 请求?
【发布时间】:2018-05-16 18:10:42
【问题描述】:

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

我的 http 请求功能包含在 http 请求的完成处理程序中,如下所示:

HTTPRequest.requestOHLC(symbol: "XBTUSD") {ohclData in
            //do something
}

我正在尝试找出在后台发送重复请求的最佳方式

我尝试过设置延迟 10 秒的 while 循环,如下所示:

while(true) {
            HTTPRequest.requestOHLC(symbol: "XBTUSD"){ ohclData in
                //do something      
            }
            sleep(10)
}

这行不通,我相信是因为 HTTP 请求是异步的,或者 sleep 函数的作用超出了我的理解。 如果有人知道这样做的正确方法,那将非常有帮助,因为我对使用互联网协议还很陌生。这似乎应该是一件相当容易的事情。 此应用程序的使用方式,当当前视图控制器打开时,需要不断发送 http 请求,并在视图控制器更改时立即停止发送

【问题讨论】:

  • “不起作用”是什么意思?这是一个iOS应用程序吗? requestOHLC 的代码是什么?
  • @NobodyNada 是的,这适用于 iOS。在 while 循环中,HTTP 请求似乎永远不会被调用。 requestOHLC 的代码调用 Alamofire 库中的 HTTP 请求方法并返回我自己的包含一组双变量的结构,我认为这不是问题,因为代码在循环外工作正常
  • 循环在哪里?它是在主线程上运行,在来自某事的回调中,在后台调度队列上,还是在什么地方?
  • @NobodyNada 目前,我只是在测试,所以它位于 viewDidLoad() 函数的末尾

标签: swift rest http httprequest


【解决方案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
}

【讨论】:

    猜你喜欢
    • 2016-11-16
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2018-08-09
    • 2021-10-26
    相关资源
    最近更新 更多