【问题标题】:Why do I need to press this button twice to display the data?为什么我需要按此按钮两次才能显示数据?
【发布时间】:2018-06-29 09:20:04
【问题描述】:

我不明白为什么我需要按两次按钮才能让标签填充收集到的数据。我不确定我的 json 解析是否有问题,或者是否存在某种范围问题。我确定这里有多余的代码,但我正在尝试所有我能想到的并通过谷歌找到的东西。

import UIKit

struct SkillStats {
var Rank, Level, Experience: String
init(Rank: String = "", Level: String = "", Experience: String = "") {
    self.Rank = Rank
    self.Level = Level
    self.Experience = Experience
    }
}

var rsn: String = ""

class ViewController: UIViewController {
  var Total = SkillStats()

@IBOutlet weak var totalXP: UILabel!
@IBOutlet weak var totalLevel: UILabel!
@IBOutlet weak var totalRank: UILabel!

@IBOutlet weak var getrsn: UITextField!
@IBAction func rsnButton(_ sender: Any) {
rsn = getrsn.text!

rsn = rsn.replacingOccurrences(of: " ", with: "%20")
rsn = rsn.replacingOccurrences(of: "-", with: "%2D")

print(rsn)

//let rsn = "Real%20Nice"
 let jsonUrlString = "http://services.runescape.com/m=hiscore_oldschool/index_lite.ws?player=" + rsn
 guard let url = URL(string: jsonUrlString) else
 {return}

 URLSession.shared.dataTask(with: url) { (data, repsonse, err) in

 guard let data = data else {return}

 let dataAsString = String(data: data, encoding: .utf8)
 //print(dataAsString)

 let result = dataAsString?.components(separatedBy: [",","\n"])

 //comment this block
 //Total.Rank = result![0]
 //Total.Level = result![1]
 //Total.Experience = result![2]


  self.Total = SkillStats(Rank: result![0], Level: result![1], Experience: result![2])

 //printing stats to console
  print("Total Rank: " + self.Total.Rank)
  print("Total Level: " + self.Total.Level)
  print("Total Experience: " + self.Total.Experience)
 }.resume()

totalRank.text = "Rank: " + Total.Rank
totalLevel.text = "Level: " + Total.Level
totalXP.text = "XP: " + Total.Experience
}

【问题讨论】:

  • 按下按钮并等待新的几秒钟,因为您正在进行 api 调用,这将需要一些时间来从服务器获取数据并更新您的标签文本。让我知道它是否有效。
  • 根据您的建议并使用 DispatchQue,我现在可以使用它了。有没有办法让 DispatchQue 的时间长度小于一秒?非常感谢!
  • 表示你想在调用 api 之前等待几秒钟吗?
  • 这是新的代码。 'DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1),执行:{ self.totalRank.text = "Rank:" + self.Total.Rank self.totalLevel.text = "Level:" + self.self.Total.Level self.totalXP.text = "XP: " + self.Total.Experience })' 是否可以传递一个小于 1 秒的值?我希望等待时间尽可能短。
  • 使用 DispatchQueue 调用 api 之前要等待几秒钟吗?

标签: ios xcode swift3 swift4


【解决方案1】:

按下按钮并等待新的几秒钟,因为您正在进行 api 调用,这将需要一些时间来从服务器获取数据并更新您的标签文本。

更新

要在几秒钟后更新您的标签,您可以执行以下操作:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {

            self.totalRank.text = "Rank: " + self.Total.Rank
            self.totalLevel.text = "Level: " + self.self.Total.Level
            self.totalXP.text = "XP: " + self.Total.Experience
        }

PS - 是的,您可以像上面的代码一样传递小于 1 的第二个值。

【讨论】:

  • 太棒了!非常感谢!
  • @zjgt37 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。
猜你喜欢
  • 2020-11-23
  • 2019-05-30
  • 2017-05-18
  • 1970-01-01
  • 2012-12-02
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多