//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 来使用 NSDictionary
和 NSString
。
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()
}