0

我试图从 Http Api 获取一些数据并使用响应的 JSON 相应地更新我的 SwiftUI 视图中的文本

问题是,我需要每秒两次获取数据,我真的不知道如何相应地刷新我的视图。

这就是我获取数据的方式

var timer = Timer()
func scheduleTimer()             
  timer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(fetchData), userInfo: nil, repeats: true)
    }

    @objc func fetchData() {
        let url:URL = URL(string: "http://XXX.XXX.XXX.23:8085/telemachus/datalink?altitude=v.altitude&longitude=v.long&latitude=v.lat&name=v.name")!
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error { print(error) }
            guard let data = data else {return}

            do {
                let jsonData = try  JSONDecoder().decode(JsonData.self, from: data)
                let altitude = jsonData.altitude
                print(altitude)
            } catch let error {
                print(error)
            }
        }.resume()
    }

我用一个计时器来重复这个动作。我还有一个 JsonData 模型。@EnvironmentObject 在这种情况下不可用,因为该函数不在视图内。

4

1 回答 1

1

首先,这会很快耗尽电池。此外,它可能会杀死带宽,并且用户可能会因请求过多而被阻止。

其次,您应该使用socket这些类型的请求而不是restful.

第三个你的答案:

每秒两次?timeInterval值更改为0.5。这将导致执行每半秒执行一次。

要更新UI,您需要使用GCDorOperation queue像这样在主线程中执行更新代码:

DispatchQueue.main.async {
    /* UI Work Goes Here */
    // for example: myLabel.text = jsonData.altitude
}
于 2019-08-03T11:59:59.490 回答