Ios 异步请求完成后,在选择表后运行segue

Ios 异步请求完成后,在选择表后运行segue,ios,json,Ios,Json,我试图在选择某个表行后运行url请求以获取JSON文件,根据该行,url请求将发送一个唯一ID,并生成不同的JSON。这是我的备考卷 // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepareForSegue(segue: UIStoryboardSegu

我试图在选择某个表行后运行url请求以获取JSON文件,根据该行,url请求将发送一个唯一ID,并生成不同的JSON。这是我的备考卷

    // MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
     // Get the new view controller using segue.destinationViewController.
    var divisionScene = segue.destinationViewController as! DivisionViewController

    // Pass the selected object to the new view controller.
    if let indexPath = tableView.indexPathForSelectedRow() {
    let arrayIndex = indexPath.row
       //println("Index: \(arrayIndex)")

        torneoIDTransfer = torneos[arrayIndex].torneoID
        //println("\(torneoIDTransfer)")


        //check second url with second request type same token
        //sets url to string using token
        let tercerURL = NSURL(string: "http://api.zione.mx/get.json.asp?tr=3&tkn=\(tkn)&tor=\(torneoIDTransfer)")

        //initializes request

        let request = NSURLRequest(URL: tercerURL!)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.currentQueue()) { response, jsonDataRequest3, error in
            let dataRequest3 = jsonDataRequest3

            //takes data, saves it as json
            let tercerJSON = JSON(data: jsonDataRequest3)

            //checks to see that contents != nil, meaning the JSON file was found
            if tercerJSON != nil {

                //checks amount of tournaments available in order to generate table.
                let divisionCount = tercerJSON["lista-divisiones"].count
                //sets global variable numero de torneos
                numeroDeDivisiones = divisionCount


                //for loop to go insert into Torneo nuevo each ID and name by using count from above
                for var index = 0; index < divisionCount; ++index {
                    var divisionID = Int(tercerJSON["lista-divisiones" ][index]["DivisionID"].number!)
                    var nomDivision = tercerJSON["lista-divisiones"][index]["nomDivision"].string
                    //println("\(divisionID)")
                    //println("\(nomDivision)")
                    var divisionNuevo = listaDivisiones(divisionID: divisionID, nomDivision: nomDivision!)
                    divisiones.append(divisionNuevo)
                    numeroDeDivisiones = 10
                    print("WHO IS FIRST")
                }
            }
            print("\(divisiones[0].nomDivision)")
        }
    }
}
//标记:-导航
//在基于故事板的应用程序中,您通常需要在导航之前做一些准备
覆盖函数prepareforsgue(segue:UIStoryboardSegue,sender:AnyObject?){
//使用segue.destinationViewController获取新的视图控制器。
var divisionScene=segue.destinationViewController作为!DivisionViewController
//将选定对象传递给新的视图控制器。
如果让indexPath=tableView.indexPathForSelectedRow(){
让arrayIndex=indexPath.row
//println(“索引:\(arrayIndex)”)
torneoIDTransfer=torneos[arrayIndex]。torneoID
//println(“\(torneoIDTransfer)”)
//使用第二个请求类型相同的令牌检查第二个url
//使用令牌将url设置为字符串
让tercerURL=NSURL(字符串:http://api.zione.mx/get.json.asp?tr=3&tkn=\(tkn)&tor=\(torneoIDTransfer)“)
//初始化请求
let request=NSURLRequest(URL:tercerURL!)
NSURLConnection.sendAsynchronousRequest(请求,队列:NSOperationQueue.currentQueue()){response,jsonDataRequest3,中出现错误
让dataRequest3=jsonDataRequest3
//获取数据,并将其保存为json
让tercerJSON=JSON(数据:jsonDataRequest3)
//检查内容!=nil,表示找到了JSON文件
如果tercerJSON!=nil{
//检查可用的锦标赛数量以生成表。
让divisionCount=tercerJSON[“lista Divisions”].count
//设置全局变量编号
NumerodeDivisions=divisionCount
//对于要进入的循环,使用上面的计数将每个ID和名称插入Torneo nuevo
对于var指数=0;指数
通过从表格单元格拖动到新的视图控制器,我创建了segway。但是,当我单击表格单元格时,转换会立即发生,在请求有机会完成之前,因此不会显示任何数据

“在请求有机会完成之前,转换立即发生”

当然,这正是异步的含义。你要特别提到它是异步的,但你一定对它的意思有误解。解释你认为它意味着什么,以及你期望你的代码是什么,这样你就可以更好地接受我们的教育

当您调用sendAsynchronousRequest()时,请将您的程序视为分支为两个(实际上,这就是实际发生的情况)。一部分是将继续执行的原始代码,即prepareFoSegue代码将继续执行。 同时,操作系统将并行执行该请求,当请求完成时,将执行传递给sendAsynchronousRequest()的块中的代码。因此,prepareforsque()函数将在收到Json之前完成

但除此之外,您不应该试图、希望或希望在segue转换之前获取JSon——这样做会停止您的ui。假设sendAsynchronousRequest()改为sendSynchronousRequest(),并用10秒完成,您认为应用程序运行时会产生什么后果


您应该在GUI准备好显示数据之前长时间提取数据,或者如果不可能,则立即显示没有数据的GUI,然后在数据到达时对其进行更新。

在用户选择表行之前,最好在后台提取和处理数据。如果这是不可能的,那么我建议让您的目标视图控制器执行URL请求。URL请求是异步发生的,因此在释放源代码视图控制器之前,它永远不会有机会完成

在源代码视图控制器中,修改
prepareforsgue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var divisionScene = segue.destinationViewController as! DivisionViewController

    if let indexPath = tableView.indexPathForSelectedRow() {
        let arrayIndex = indexPath.row

        torneoIDTransfer = torneos[arrayIndex].torneoID

        let tercerURL = NSURL(string: "http://api.zione.mx/get.json.asp?tr=3&tkn=\(tkn)&tor=\(torneoIDTransfer)")

        divisionScene.fetchDataAtURL(tercerURL)
    }
}
您需要在目标视图控制器中定义一个方法来处理抓取

func fetchDataAtURL(URL: NSURL) {
    let request = NSURLRequest(URL: tercerURL!)
    NSURLConnection.sendAsynchronousRequest( // ... your fetching logic here
}
一旦数据到达,您还需要一些逻辑来显示数据。我建议将其放入请求的完成回调中(或者让回调触发显示更新)。如果您的
场景
是一个表视图,您可能可以调用
重新加载数据
(在更新数据源之后)。如果没有,则需要其他方法来更新UI。如果要更新UI,请确保
分派到该部件的主队列


这样做至少会将URL加载责任传递给目标视图控制器,该控制器至少会在数据最终到达时出现。

我最初尝试这样做时,遇到的问题是DidSelectRowatineXpath不允许我基于所选行获取JSON。因此,我选择在prepareForSegue中获取它<代码>func tableView(tableView:UITableView,didSelectRowatineIndeXpath:NSIndexPath){println(“已选择行”)性能