ios - 嵌套 JSON 解析器

标签 ios json swift alamofire

我是 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/

相关文章:

iphone - iOS 设置.plist

ios - 如何在 iPhone 的应用程序中播放 youtube/vimeo 视频

jquery - 滚动时全屏背景在 iPad 上变成空白

arrays - 如何使用 jq 对可能不存在的数组进行排序?

ios - 如何为以前的值制作检索按钮

ios - 从 healthkit 查询中排除自己的样本

php - stdClass 类的对象无法转换为字符串 - 找不到解决方案

javascript - 对我的 Web 服务的 Ajax 查询在我的 json 中返回 xml

ios - 我使用 NSAttributedString 还是 UIWebView Swift

ios - 当应用程序/ View Controller 离开前台时, Realm 因无效对象而崩溃