ios - 从服务器获取 JSON 后如何更新应用程序中的标签?如果应该实时更新

标签 ios json swift

我正在制作一个板球应用程序。每次服务器向我发送 JDON 文件时,我想从 URL 更新 iOS 中的标签。 URL代码应该怎么写?

import UIKit
import Foundation

struct jsonScore : Decodable  {
    let comment : String
    let venuDetails : String
    let valueToDisplay : String
    let bowlingTeam : String
    let battingTeam : String

    let overs : Double
    let targetScore : Int
    let wickets : Int
    let score : Int

    let striker : striker
    let nonStriker : nonStriker
    let strikerBowler : strikerBowler
}

struct striker : Decodable{
    let name: String
    let runs: String
    let balls: String
    let fours: String
    let sixes: String
}

struct nonStriker : Decodable{
    let name: String
    let runs: String
    let balls: String
    let fours: String
    let sixes: String
}

struct strikerBowler : Decodable{
    let name : String
    let overs : String
    let maidens : String
    var runs : String
    let wickets : String
}

class ViewController: UIViewController {
    @IBOutlet weak var Comment: UITextView!
    @IBOutlet weak var VenuDetails: UILabel!
    @IBOutlet weak var ValueToDisplay: UILabel!
    @IBOutlet weak var battingTeam: UILabel!
    @IBOutlet weak var bowlingTeam: UILabel!

    @IBOutlet weak var wickets: UILabel!
    @IBOutlet weak var overs: UILabel!

    @IBOutlet weak var score: UILabel!

    @IBOutlet weak var striker: UILabel!
    @IBOutlet weak var strikerRun: UILabel!

    @IBOutlet weak var nonStriker: UILabel!
    @IBOutlet weak var nonStrikerRun: UILabel!

    @IBOutlet weak var strikerBowlerName: UILabel!
    @IBOutlet weak var strikerBowlerOver: UILabel!

    var timer = Timer()
    // start the timer

    override func viewDidLoad() {
        super.viewDidLoad()
        timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(getUpdatedData), userInfo: nil, repeats: true)
    }

    @objc func getUpdatedData() {
        let jsonUrlString = "url from server"

        guard let url = URL(string : jsonUrlString ) else
        { return }

        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else { return }
            //get your updated data here and update it into the UI.

            do {
                let jsonscore = try JSONDecoder().decode(jsonScore.self, from: data)

                self.VenuDetails.text = jsonscore.venuDetails
                self.Comment.text = jsonscore.comment
                self.bowlingTeam.text = jsonscore.bowlingTeam
                self.battingTeam.text = jsonscore.battingTeam
                self.ValueToDisplay.text = jsonscore.valueToDisplay
                self.wickets.text = String(jsonscore.wickets)
                self.overs.text = String(jsonscore.overs)

                self.score.text = String(jsonscore.score)
                self.striker.text = jsonscore.striker.name + "*"
                self.strikerRun.text = jsonscore.striker.runs

                self.nonStriker.text = jsonscore.nonStriker.name
                self.nonStrikerRun.text = jsonscore.nonStriker.runs

                self.strikerBowlerName.text = jsonscore.strikerBowler.name
                self.strikerBowlerOver.text = jsonscore.strikerBowler.overs

                print(jsonscore)

            }catch let jsonErr{
                print("Error serializing json:", jsonErr)
            }
        }.resume()
    }
}

如何编写代码,以便一旦从服务器获取 JSON,它就会在应用程序中更新?我也使用了计时器,但应用程序中的标签在第一次更新后没有更新。我想在服务器发送 JSON 文件后立即更新应用程序标签,并且应该重复更新。

请帮我写代码。

最佳答案

正如 @Rmaddy 所说,你使用计时器是一个坏主意。您可以在苹果的 Energy Efficiency Guide for iOS Apps 中看到原因。

Timers prevent the CPU from going to or staying in the idle state, which increases energy usage and consumes battery power.

这种过度使用最终会耗尽设备电池。

您应该使用更有效的东西,例如 web sockets (正如@the4kman 所建议的)。通过使用网络套接字,您将需要稍微改变一下您的方法。您应该考虑更改服务器以通知应用程序,而不是让应用程序不断从服务器下载数据。

以下是一些您可以使用的 Web 套接字库:

Starscream

Socket.io

SwiftWebSocket

关于ios - 从服务器获取 JSON 后如何更新应用程序中的标签?如果应该实时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49196960/

相关文章:

ios - 内存泄漏。我怎样才能修复它们

ios - 滚动时隐藏tableViewCell中的复选标记

ios - 将 CGPoints (CIRectangleFeature) 从 Image 转换为 ImageView

javascript - http请求获取正文

json - json 内容类型开头的奇怪字符

MySQL使用nodeJs嵌套Json对象

xcode - 我想创建第二个按钮,但它没有出现 - Xcode 6 Swift

ios - 如何在键盘上方显示键盘?

swift - Facebook 共享对话框失败 - 操作无法快速完成

java - 如何在 Android(Java) 中使用 json 反斜杠