我是 Swift 和 iOS 开发的新手,无法理解某些内容。我尝试使用 Alamofire 将 JSON 解析为 UiTableView。但 JSON 的响应包含另一个 JSON 请求的嵌套 url。除此之外,我还使用 MBProgressHUD 来显示“请稍候” View 。 当我处理所有 JSON 响应时,如何隐藏此进度 View ?
我有下一个解析 JSON 的代码。
func loadFileList(){
let defaults = NSUserDefaults.standardUserDefaults()
let login = defaults.valueForKey("login") as! String
let password = defaults.valueForKey("password") as! String
Alamofire.request(.GET, Links.apiUrl)
.authenticate(user: login, password: password)
.responseJSON { response in
let json = SwiftyJSON.JSON(response.result.value!)
for (_, value):(String, SwiftyJSON.JSON) in json {
let file: CacheFile! = CacheFile(filename: value["name"].string!, preview: value["preview"].string!, id: value["id"].string!)
print (file.filename)
dispatch_async(dispatch_get_main_queue(), {
self.fileList.append(file)
self.tableView.reloadData()
})
Alamofire.request(.GET, file.layoutURL)
.authenticate(user: login, password: password)
.responseJSON{ responseLayout in
let jsonLayout = SwiftyJSON.JSON(responseLayout.result.value!)
let layoutsArray = jsonLayout["layouts"]
for (_, layoutObj):(String, SwiftyJSON.JSON) in layoutsArray{
let alias = layoutObj["alias"].string!
let layoutFile: Layout! = Layout(name: layoutObj["name"].string!, alias: Int(alias))
print (layoutFile.name)
file.addLayout(layoutFile)
}
}
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
dispatch_async(dispatch_get_main_queue()) {
self.hideHUD()
}
}
}
但是,当 HUD 隐藏并且数据显示在 View 中时,它会解析嵌套的 JSON。如何修复它?
P.S 或者,如果没有 Alamofire,我该怎么做?
最佳答案
当返回第一个 json 时,您确实会关闭 HUD。
要隐藏 HUD,当所有 JSON 返回时,您只需要稍微重新排列一下代码:
Alamofire.request(.GET, Links.apiUrl)
.authenticate(user: login, password: password)
.responseJSON { response in
let json = SwiftyJSON.JSON(response.result.value!)
for (_, value):(String, SwiftyJSON.JSON) in json {
let file: CacheFile! = CacheFile(filename: value["name"].string!, preview: value["preview"].string!, id: value["id"].string!)
print (file.filename)
dispatch_async(dispatch_get_main_queue(), {
self.fileList.append(file)
self.tableView.reloadData()
})
Alamofire.request(.GET, file.layoutURL)
.authenticate(user: login, password: password)
.responseJSON{ responseLayout in
let jsonLayout = SwiftyJSON.JSON(responseLayout.result.value!)
let layoutsArray = jsonLayout["layouts"]
for (_, layoutObj):(String, SwiftyJSON.JSON) in layoutsArray{
let alias = layoutObj["alias"].string!
let layoutFile: Layout! = Layout(name: layoutObj["name"].string!, alias: Int(alias))
print (layoutFile.name)
file.addLayout(layoutFile)
}
dispatch_async(dispatch_get_main_queue()) {
self.hideHUD()
self.tableView.reloadData()
}
}
}
}
基本上,您需要将 self.hideHUD 调用包装在第二个 JSON 调用的完成 header 中。
关于ios - 嵌套 JSON 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33232678/