我的应用程序中有一个tableView,当我加载应用程序时,我希望视图中填充一系列狗(从服务器检索)。
我有这个工作,但它只会从服务器加载列表中的第一只狗。
这里的代码从它从服务器序列化JSON响应开始
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [AnyObject]
dispatch_async(dispatch_get_main_queue(), {
self.tableView.beginUpdates()
if let theDogs = json[0] as? [[String: AnyObject]] {
for dog in theDogs {
print("Dog")
if let ID = dog["ID"] as? String {
print(ID + " Safe")
let thisDog = Dog(name: (dog["Name"] as? String)!, surname: (dog["Surname"] as? String)!, id: (dog["ID"] as? String)!, boarding: true)
let newIndexPath = NSIndexPath(forRow: self.dogs.count, inSection: 0)
// code here
self.dogs.append(thisDog)
self.tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Bottom)
}
}
}
self.tableView.endUpdates()
})
} catch {
print("error serializing JSON: \(error)")
}
这是日志的副本(包括来自服务器的打印响应)
Optional([[{"ID":"47","Name":"Sparky","Surname":"McAllister"}],
[{"ID":"31","Name":"Maddie","Surname":"Crawford"}]])
Dog
47 Safe
从日志中可以看出,此列表中有2只狗。
如果循环正常,我希望在日志中看到Dog
两次打印,如果它到达创建新31 Safe
对象的代码部分,则Dog
。
我无法弄清楚我做错了什么,有人能看到我的问题吗?
感谢
答案 0 :(得分:1)
因为JSON是一个包含一个字典的数组数组,当你调用if let theDogs = json[0]
时,你会得到这部分JSON:[{"ID":"47","Name":"Sparky","Surname":"McAllister"}]
您需要调用if let theDogs = json[1]
来获取JSON的这一部分:
[{"ID":"31","Name":"Maddie","Surname":"Crawford"}]
答案 1 :(得分:1)
好的,多亏了特拉维斯的回答,我能够看到我哪里出错了。我只是对他的建议进行了一些调整,所以我发帖作为答案。
正如特拉维斯所说,我需要访问json[1]
,但我可以在该列表中拥有7只不同的狗!
所以我做了以下更改:
if let theDogs = json[0] as? [[String: AnyObject]] {
现在是: 如果让theDogs = json为? [[AnyObject]] {
这意味着在for循环中我正在访问根数组。
然后我改变了for循环:
for dog in theDogs{
于: for theDogs中的aDog { 让狗= aDog [0]
这意味着对于theDogs中的每个数组,我将获得数组中唯一的对象并将其称为dog。 问题解决了,未来证明了。
感谢所有帮助过的人!