2015-10-20 332 views
0

我是Swift和iOS开发的新手,无法理解某些东西。我尝试使用Alamofire将JSON解析为UiTableView。但是JSON的响应包含嵌套的url到另一个JSON请求。除此之外,我使用MBProgressHUD进行“Please wait”视图。 当我处理所有JSON响应时,如何隐藏此进度视图?嵌套的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?

回答

0

当第一个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调用完成头。

+0

但是为什么?我的回应是JSON数组,为什么我必须在完成解析第一个外部JSON的嵌套JSON之后隐藏HUD?例如,我有5个项目在第一个请求的响应和5嵌套。第一次请求的第一个元素和5个项目之后,我必须隐藏HUD?或者我错了? –

+0

当所有数据都返回正确时,您想要关闭HUD吗?我的意思是这是原来的问题。或者你的主要问题是什么? – dirtydanee

+0

是的,你说得对。但是当HUD被解雇时,我在控制台中看到了嵌套请求的名称。所以它应该是? –