如何将所有键的 NSdictionary 值插入到 uitableView Swift 3.0


    //uitableoutletname
@IBOutlet weak var tableview: UITableView!
//overridefunction
override func viewDidLoad()
{
    super.viewDidLoad()
    let url = URL(string: "http://api.fixer.io/latest")
    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

                    //convert to nsdictionary
                    if let rates = myJson["rates"] as? NSDictionary
                    {
                        var myarry = [NSString]()
                        for (_,value) in rates
                        {
                            //thispart is giving error how cat it be resolved

                            myarry.append(value as! NSString)
                            self.tableview.beginUpdates()
                            self.tableview.insertRows(at: [IndexPath(row: myarry.count-1, section: 0)], with: .automatic)
                            self.tableview.endUpdates()
                        }
                    }
                }
                catch
                {
                }
            }
        }
    }
    task.resume()
}

我通过 json 调用获取数据,将其转换为 nsdictionary 并尝试插入到 uitableview 中。它给出了一些运行时错误。当我打印变量值和使用打印组件的键时,它运行良好。

dataTask是一个异步任务,你应该更新主线程上的 UI。另外,让我们使用 Swift 类型的 intead 来使用 NSDictionaryNSString

if let rates = myJson["rates"] as? [String: Double] {
    DispatchQueue.main.async {
        for (_, value) in rates {
            self.myarry.append(String(value))
            self.tableview.beginUpdates()
            self.tableview.insertRows(at: [IndexPath(row: self.myarry.count-1, section: 0)], with: .automatic)
            self.tableview.endUpdates()
        }
    }
}
对我来说

,看起来您正在从非地雷线程中触发UI代码,因为URLSession将创建自己的线程。尝试使用 GCD 包装表视图代码:

DispatchQueue.main.async {
    self.tableview.beginUpdates()
    self.tableview.insertRows(at: [IndexPath(row: myarry.count-1, section: 0)], with: .automatic)
    self.tableview.endUpdates()
}

最新更新