【问题标题】:Nested JSON parser嵌套 JSON 解析器
【发布时间】:2015-10-20 09:18:05
【问题描述】:

我是 Swift 和 iOS 开发的新手,有些东西看不懂。我尝试使用 Alamofire 将 JSON 解析为 UiTableView。但是 JSON 的响应包含另一个 JSON 请求的嵌套 url。除此之外,我将 MBProgressHUD 用于“请稍候”视图。 当我处理所有 JSON 响应时,如何隐藏此进度视图?

我有下一个解析 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 隐藏并且数据显示在视图中时,它会解析嵌套的 JSON。如何解决?

P.S 或者如果没有 Alamofire,我该怎么做?

【问题讨论】:

    标签: ios json swift alamofire


    【解决方案1】:

    当返回第一个 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 调用的完成标头中。

    【讨论】:

    • 但是为什么呢?我的响应是 JSON 数组,为什么我必须在完整解析第一个外部 JSON 的嵌套 JSON 后隐藏 HUD?例如,我有 5 个响应第一个请求的项目和 5 个嵌套的项目。我必须在第一个请求的第一个元素和它的 5 个项目之后隐藏 HUD 吗?还是我错了?
    • 您想在返回所有数据后关闭 HUD,对吗?我的意思是这是最初的问题。或者你的主要问题是什么?
    • 是的,你是对的。但是当 HUD 被解除时,我在控制台中看到了嵌套请求的名称。应该是这样吗?
    • print (layoutFile.name) 这就是您在控制台中看到它的原因。没关系。
    • 这对我没有帮助。 i.imgur.com/eKfO2P4.jpg 看到它。当HUD被隐藏时,我快速点击文件。
    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多