swift - 在 Swift 中使用 Alamofire 频繁地从 API 中拉取
问题描述
我是 Swift 新手,我想每 5 秒使用一次 get 请求从 API 中提取,我已经完成了 HTTP 请求提取和解析。我只是想知道我应该在我的控制器类中放置某种循环。
这是我的控制器类代码:
import UIKit
import Alamofire
import SwiftyJSON
class HomePageViewController: UIViewController {
@IBOutlet weak var name: UILabel!
@IBOutlet weak var age: UILabel!
@IBOutlet weak var email: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
getRequest()
// Do any additional setup after loading the view.
}
// the function that get Request from the API
func getRequest(){
AF.request("http://vocation.cs.umd.edu/flask/tempjson", method: .get)
.responseJSON { (response) in
do{
let json = try JSON(data: response.data!)
let nm = json["username"].string
let ag = json["age"].int
let em = json["email"].string
// display
self.name.text = "Welcome, \(nm ?? "")"
self.age.text = "Age: \(ag ?? 0)"
self.email.text = "Email: \(em ?? "")"
} catch let jsonErr{
print(jsonErr)
}
}
}
}
我知道我把 pull 函数放在了viewDidLoad()
,但是当我以 5s 的频率停留在这个页面时,我在哪里执行这个函数,我可以使用什么样的循环来确保它每 5s 执行一次?谢谢!!
解决方案
如果您只想每 5 秒打一次电话,您可以使用预定计时器
class HomePageViewController: UIViewController {
// ...
var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true, block: { [weak self] (timer) in
self?.getRequest()
})
getRequest() // Call it initially because the scheduledTimer will only call it after the initial 5 seconds
}
func getRequest() {
// ...
}
}
我建议等待请求的响应(如果互联网状况不佳,请求可能需要超过 5 秒的时间,并且您最终会收到“重叠”请求。
这是一个在响应后 5 秒执行请求的解决方案
class HomePageViewController: UIViewController {
// ...
override func viewDidLoad() {
super.viewDidLoad()
getRequest()
}
func getRequest() {
AF.request("http://vocation.cs.umd.edu/flask/tempjson", method: .get).responseJSON { (response) in
do{
let json = try JSON(data: response.data!)
let nm = json["username"].string
let ag = json["age"].int
let em = json["email"].string
// display
self.name.text = "Welcome, \(nm ?? "")"
self.age.text = "Age: \(ag ?? 0)"
self.email.text = "Email: \(em ?? "")"
} catch let jsonErr{
print(jsonErr)
}
// Trigger a new request 5s after the response
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: { [weak self] in
self?.getRequest()
})
}
}
}
推荐阅读
- php - 如何拆分 wordpress the_content() ;分成几个部分
- javascript - 我们有 2 条线路。我们如何才能得到 2 行与 JavaScript 相交的点?
- mongodb - Go + MongoDB:多态查询
- php - PHP 使用 Intelephense 调用 mysqli 的正确方法
- javascript - 浏览器中的 OpenSSL - 需要从 .pem 获取私钥然后签名
- javascript - 每次页面访问随机化 stylesheet.css
- react-native - react-native install vs link有什么区别?
- python - TensorFlow 的占位符初始化不同于 TensorFlow 的常量初始化。为什么?
- git - Git windows克隆符号链接
- java - Java左移运算符