使用 alomafier 请求调用 api 在响应中获取数据,但在请求下方它会变为空白

Posted

技术标签:

【中文标题】使用 alomafier 请求调用 api 在响应中获取数据,但在请求下方它会变为空白【英文标题】:Call api using alomafier request get data inside a response but below request it get blank 【发布时间】:2016-11-15 12:07:22 【问题描述】:

我调用此函数,我从 alomafier 请求中获得 json 响应,但是当我声明全局变量并将数据存储在从结果中获取的变量中,但在响应循环下方打印变量时,它会变为空白或为零。

我使用字典数组但没有得到解决方案。

Alamofire.request(url,method: .post).responseJSON  response in
var data1 = response.result.value ---- I get response here but not get result outside of the loop

代码:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cellIdentifier = "Cell"
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! CustomTableViewCell_view

    var domain:[[String:String]] = []


    var asyncObj:Operations = Operations()
    var url:String = asyncObj.getUrl("ticket", operation: "get_domain", filter: "")
    Alamofire.request(url,method: .post).responseJSON  response in

        var data1 = response.result.value
        //let data1 = response.data

        if(data1 != nil)
        
            var json1 = JSON(data1!)
            GlobalVar.myvar = 10
            let count: Int? = json1.array?.count
            var departmentList = [DEPARTMENT]()
            for index in 0 ..< count! 
                var domainid = json1[index]["domain_id"]
                var domainname = json1[index]["domain_name"].stringValue
                self.numbers.append(count!)
                cell.nameLabel.text = "- "+domainname

                var url:String = asyncObj.getUrl("ticket", operation: "get_department", filter: "vis_filter=avis_domain.domain_id=\(domainid)")
                Alamofire.request(url,method: .post).responseJSON  response in

                    var data2 = response.result.value
                    var departmentList:[[String:String]] = []
                    if data2 != nil 
                        var json2 = JSON(data2!)
                        var count2: Int? = json2.array?.count
                        for index2 in 0 ..< count2!
                            var departmentid = json2[index2]["department_id"]
                            var departmentname = json2[index2]["department_name"]
                            //departmentList.append(["departmentid": "\(departmentid)", "departmentname": "\(departmentname)"])
                            cell.addressLabel.text = "- "+"\(departmentname)";
                            var url:String = asyncObj.getUrl("ticket", operation: "get_department_status_list", filter: "vis_department=\(departmentid)")
                            Alamofire.request(url,method: .post).responseJSON  response in

                                var data3 = response.result.value

                                if data3 != nil 
                                    var json3 = JSON(data3!)
                                    var statusList:[[String:String]] = []
                                    var count3: Int? = json3.array?.count
                                    for index3 in 0 ..< count3!
                                        var statusid = json3[index3]["status_id"]
                                        var statusname = json3[index3]["status_name"]
                                        cell.status.text = "- "+"\(statusname)";
                                        var url:String = asyncObj.getUrl("ticket", operation: "get_tickets", filter: "vis_filter=status_id=\(statusid)&\(VIS_PREFIX)ticket.department_id=\(departmentid)")
                                        Alamofire.request(url,method: .post).responseJSON  response in

                                            var data4 = response.result.value

                                            var tcount: Int?
                                            var ticketcount:Int = 0
                                            if data4 != nil 
                                                var json4 = JSON(data4!)
                                                tcount = json4.array?.count
                                                for index3 in 0 ..< tcount! 
                                                    ticketcount = ticketcount + 1
                                                
                                            


                                        
                                    

                                
                            

                        




                    
                
            

        
    



    /*let hotelName = hotelNames[(indexPath as NSIndexPath).row]
    cell.nameLabel.text = hotelName
    cell.addressLabel.text = hotels[hotelName]
    */
    return cell

【问题讨论】:

这个问题很难理解。有很多错别字(“alomafier”),根本不清楚您期望发生什么以及实际发生什么。 您在调用 API 时使用了错误的方法。您只需要创建一个带有 alamofire 请求功能的网络类,当您调用此方法时,只需将完成处理程序传递给它并获取所有响应。 【参考方案1】:

我不确定您要问什么,但听起来您希望全局变量会立即更新。实际上,只有在收到响应后才会更新。

这是一个例子:

var status = "Nothing much"

Alamofire.request("https://example.org/something").responseJSON  response in
    // This code runs in the future, probably after a few seconds
    status = "Got a response!" 


// This code runs immediately
print(status) // Prints "Nothing much"

在这里,状态(如您的全局变量)被初始化为一个值。接下来,发送一个 Alamofire 请求,并带有一个最终更新状态变量的响应回调。但是,程序在继续之前不会等待响应进来。这就是下一行打印出“Nothing much”的原因。

【讨论】:

输出没什么大不了的。那我该怎么办。 你应该学习异步编程。如果您使用 Alamofire,这是一个非常重要的概念。您可以从raywenderlich.com/121540/alamofire-tutorial-getting-started 开始 先生,我试过 tableView.reloaddata() ,它的工作,但问题是它显示响应无限循环

以上是关于使用 alomafier 请求调用 api 在响应中获取数据,但在请求下方它会变为空白的主要内容,如果未能解决你的问题,请参考以下文章