使用 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 在响应中获取数据,但在请求下方它会变为空白的主要内容,如果未能解决你的问题,请参考以下文章

NodeJ使用请求承诺来调用外部API,从响应主体中保存数据

在节点中创建 REST API 时,如何将来自对外部网站的请求的 http 响应流式传输到原始 api 调用?

如何从 Node.js 中的 API 请求创建响应流?

如何使用jquery监视ajax请求的进度响应

Agora 云端录制 API 查询(获取请求)响应 404

编写Twisted Client以向多个API调用发送循环GET请求并记录响应