在使用两个嵌套的 alamofire 请求滚动之前,TableView 不显示数据

Posted

技术标签:

【中文标题】在使用两个嵌套的 alamofire 请求滚动之前,TableView 不显示数据【英文标题】:TableView not showing data until scrolling with two nested alamofire request 【发布时间】:2018-11-01 19:26:34 【问题描述】:

我有两个服务可以为我提供数据,第一个服务可以获取经度和纬度。我将它们发送到 google 位置服务以获取“formatted_address”,然后将此格式化地址填充到 TableView 中

func getData()
    locDataArray.removeAll()

     let url = "http://someurl/Report/v1/TripReport?UserID=101&Username=ewe2020&DeviceID=2647&FromDate=25/10/2018%2006:00%20AM&lang=ar&ToDate=25/10/2018%2009:00%20PM"

        // or if you need the string
        print(url)

        Alamofire.request(url).responseJSON  (responseData) -> Void in
            if((responseData.result.value) != nil) 
                let swiftyJsonVar = JSON(responseData.result.value!)

                if let data = swiftyJsonVar.stringValue.data(using: .utf8) 
                    if let json = try? JSON(data: data) 
                        for item in json["data"].arrayValue 
                            self.locDataArray.append(LocData(fromJson: item))
                        
                    

                    DispatchQueue.main.async
                        self.getAddress()
                        self.table.reloadData()
                    
                
            
        

用于获取位置的经纬度 这适用于谷歌 api:

for loc in self.locDataArray

    let urlComponents = URLComponents(string: "https://maps.googleapis.com/maps/api/geocode/json?latlng="+loc.fromLat!+","+loc.fromLong!+"&key=*************")!

    Alamofire.request(urlComponents).responseJSON  (responseData) -> Void in
        if((responseData.result.value) != nil) 
            let swiftyJsonVar = JSON(responseData.result.value!)
            self.locNameFrom.append((swiftyJsonVar.dictionary!["results"]?[0]["formatted_address"].string)!)
         else 
            print("empty")
        
    

最后,在 cellForRowAt 中

if locNameFrom.count > 0 
    cell?.from.text = locNameFrom[indexPath.row]

数据仅在向上或向下滚动后显示。

【问题讨论】:

你在第一次请求后调用了"reloadData()",所以仍然没有数据显示,你应该在第二次请求完成后调用它 【参考方案1】:
if((responseData.result.value) != nil) 
                let swiftyJsonVar = JSON(responseData.result.value!)

                self.locNameFrom.append((swiftyJsonVar.dictionary!["results"]?[0]["formatted_address"].string)!)
                self.table.reloadData() // <-- here you should reloadData.
            

【讨论】:

以上是关于在使用两个嵌套的 alamofire 请求滚动之前,TableView 不显示数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Alamofire API 请求的主体中发送嵌套对象?

带有嵌套参数的 Alamofire POST 请求不返回任何内容

使用 URLRequestConvertible 协议将 JSON 嵌套为请求参数 (Alamofire)

取消对 Alamofire 图像的请求

Alamofire 嵌套 JSON 序列化器

在每个 Alamofire 请求之前/之后调用一个函数