swift - 如何在 Swift 中发送重复的 HTTP 请求?

标签 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 请求是异步的,要么 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/

相关文章:

iOS RxSwift - 如何将 “disconnect” 设为可观察对象?

swift - Storyboard UIView 对象未实例化

javascript - 拥有公共(public) API,但只允许访问从我的网站发送的请求

java - Spring + Jackson + 反序列化通用对象列表

java - 如何在 spring RestController 中处理字符编码

html - <link ...> 中缺少 http(s) - 有效吗?

ios - 使用 Swift 以编程方式向按钮添加约束

arrays - 如何在 Swift 中创建 UIView 对象的副本,并减小特定标签的字体大小(其中以编程方式创建 View )?

rest - 如何通过将 blob 拆分为 block 并使用 REST 和 PHP 调用 PutBlockList 将其上传到 windows azure

ruby - 如何在 Rails 3 中通过 http 传输视频