Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 要标记的Json数据_Ios_Json_Swift_Label - Fatal编程技术网

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
语句合并为一个