首页 > 解决方案 > Swift 范围界定问题,在 alamofire 请求函数中添加变量,但变量在函数之外时似乎丢失了

问题描述

当我尝试添加通过调用我的 API 获得的 GeoPoint 时,我可以在 Alamofire.request 中打印它,但它没有任何内容。此外,在函数结束时,没有什么可以返回。第一次打印工作正常,但第二次打印,在函数结束时,它什么也不打印。

//function used to get geopoints info
func loadParkingLotsInfo() -> [[GeoPoint]]?{
    
    var locations: [[GeoPoint]] = []
    var location: [GeoPoint] = []
    
    let header: HTTPHeaders = [
        "Subscriber-UUID": "jgwqjdgjhqwhqhwjgdhqwdhqwd",
        "Trx-ID": "651426512"
    ]
    
    Alamofire.request(ip + "/api/zones/all", method: .get, headers: header).responseJSON{
        (DataResponse) in
        if let data = DataResponse.data{
            do {
                let json = try JSON(data: data)
                for (_, subjson) in json["data"]{
                    location = []
                    for (_, geoinfo) in subjson["geopoints"]{
                        let latitude = geoinfo["latitude"].doubleValue
                        let longitude = geoinfo["longitude"].doubleValue
                        let id = geoinfo["id"].intValue
                            
                            let geoPoint = GeoPoint(id: id, latitude: latitude, longitude: longitude)
                            location.append(geoPoint)
                    }
                    locations.append(location)
                    for loc in locations{
                        for point in loc{
                            print(point.id)
                        }
                    }
                }
                
            }catch{
                
            }
        }
    }
    for loc in locations{
        for point in loc{
            print(point.id)
        }
    }
    return locations
}

标签: swift

解决方案


您应该将完成处理程序作为参数传递,如下所示:

func loadParkingLotsInfo(completion:@escaping (_ locations: [[GeoPoint]]) -> Void) {

var locations: [[GeoPoint]] = []
var location: [GeoPoint] = []

let header: HTTPHeaders = [
    "Subscriber-UUID": "jgwqjdgjhqwhqhwjgdhqwdhqwd",
    "Trx-ID": "651426512"
]

Alamofire.request(ip + "/api/zones/all", method: .get, headers: header).responseJSON{
    (DataResponse) in
    if let data = DataResponse.data{
        do {
            let json = try JSON(data: data)
            for (_, subjson) in json["data"]{
                location = []
                for (_, geoinfo) in subjson["geopoints"]{
                    let latitude = geoinfo["latitude"].doubleValue
                    let longitude = geoinfo["longitude"].doubleValue
                    let id = geoinfo["id"].intValue
                        
                        let geoPoint = GeoPoint(id: id, latitude: latitude, longitude: longitude)
                        location.append(geoPoint)
                }
                locations.append(location)
                for loc in locations{
                    for point in loc{
                        print(point.id)
                    }
                }
                completion(locations)
            }
            
        }catch{
            
        }
    }
}

推荐阅读