Ios 要标记的Json数据
我已经为此挣扎了一段时间,只是需要一些关于这个基本问题的快速帮助Ios 要标记的Json数据,ios,json,swift,label,Ios,Json,Swift,Label,我已经为此挣扎了一段时间,只是需要一些关于这个基本问题的快速帮助 let url = URL(string: "https://api.coindesk.com/v1/bpi/currentprice.json") let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in if error != nil { print ("Error!") } el
let url = URL(string: "https://api.coindesk.com/v1/bpi/currentprice.json")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil
{
print ("Error!")
}
else
{
if let content = data
{
do
{
// Array
let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
if let rates = myJson["bpi"] as? NSDictionary
{
if let currency = rates["USD"] as NSDictionary
{
if let money = currency["rate"]
{
print(money)
}
}
}
}
catch
{
}
}
}
}
task.resume()
self.label.text = (self.money as String?)
我试图将“money”的数值传递给视图控制器中的标签。主要问题是,您试图从异步网络请求的完成处理程序外部更新标签。但是,您的代码还有其他几个问题。您不应该在Swift中使用
NSDictionary
,在解析JSON字典时使用[String:Any]
.mutableContainers
在Swift中也没有任何效果。还要确保向主线程发送任何与UI相关的更新
let url = URL(string: "https://api.coindesk.com/v1/bpi/currentprice.json")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
guard let data = data else {
print(error!); return
}
do {
if let myJson = try JSONSerialization.jsonObject(with: content) as? [String:Any],
let rates = myJson["bpi"] as? [String:Any],
let currency = rates["USD"] as? [String:Any],
let money = currency["rate"] as? String {
DispatchQueue.main.async{
self.label.text = money
}
}
} catch{
print(error)
}
}
task.resume()
不相关,但为什么在Swift中使用
NSDictionary
?使用快速字典。不要在Swift中使用可变容器选项。不要使用AnyObject
。不,主要问题是没有人尝试更新标签(在任何线程上)。@rmaddy实际上有人尝试过:self.label.text=(self.money as String?)
,但正如我所说的,这超出了完成处理程序的范围,问题与线程索引操作无关。我没有向下滚动到问题的最后一行,我在看打印的。因此,问题是在异步数据加载开始之前很久就试图更新标签了。非常感谢,我现在理解了我的错误,它可以工作了@Rob谢谢你的提醒,我错过了一些?
事实上,现在就更正了它,并将if
语句合并为一个