【发布时间】: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 之前要等待几秒钟吗?