无法从函数中检索填充的数组

Cannot retrieve populated array from a function

我有一个函数 getZipCodefromURL,它从天气数据服务中检索数据,解析 json,并将信息分类到我的 array 中。在我的应用程序中,我设置了一个文本字段、一个按钮和标签,以便用户可以在文本字段中输入他或她的邮政编码并点击按钮,该按钮将使用有关他们所在地区的天气信息更新标签。

我认为我面临的问题是我的函数设置方式或调用方式。在我的 enterButton 函数中,我想从 getZipCodeinURL 检索我填充的数组,但是当我调用它时,它 returns 是空的,我无法索引它。到目前为止,这就是我所拥有的:

    var array: [String] = []

    func getZipCodeinURL(zipCode: String) -> NSArray{
           let urlPath = "http://api.openweathermap.org/data/2.5/weather?zip=\(zipCode),us&units=imperial"
            let url: NSURL = NSURL(string: urlPath)!
            let session = NSURLSession.sharedSession()
            let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
                if error != nil {
                    // If there is an error in the web request, print it to the console
                    println(error.localizedDescription)
                    return
                }
                var err: NSError?
                var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
                if err != nil {
                    // If there is an error parsing JSON, print it to the console
                    println("JSON Error \(err!.localizedDescription)")
                    return
                }
                let json = JSON(jsonResult)
                var temp = json["main"]["temp"].stringValue
                var humidity = json["main"]["humidity"].stringValue
                var pressure = json["main"]["pressure"].stringValue
                self.array = [temp, humidity, pressure]
            })
            task.resume()
         return array
        }

@IBOutlet weak var pressureLabel: UILabel!
    @IBOutlet weak var humidityLabel: UILabel!
    @IBOutlet weak var tempLabel: UILabel!
    @IBAction func enterButton(sender: AnyObject) {
        var zipCode = zipcodeText.text
        var weatherArray: NSArray = getZipCodeinURL(zipCode)
        var temperature: AnyObject = weatherArray[0]
            }

有谁知道如何将我填充的 ​​array 从我的函数正确检索到我的 enterButton 函数中?

查看 Alamofire 并专门查看响应处理。

本质上,您可以进行 GET 调用并告诉代码在该调用有响应后执行。 Alamofire 还直接与 SwiftyJSON 集成。使您的 responseJSON 变得非常容易。

你可以很容易地做到这一点。

@IBAction func enterButton(sender: AnyObject) {
   getZipCodeinURL(zipCode)
}


func getZipCodeinURL(zipCode: String){
     Alamofire.request(.GET, "http://api.openweathermap.org/data/2.5/weather?zip=\(zipCode),us&units=imperial")
        .responseJSON { jsonResult in
           debugPrint(jsonResult)

            let json = JSON(jsonResult)
            var temp = json["main"]["temp"].stringValue
            var humidity = json["main"]["humidity"].stringValue
            var pressure = json["main"]["pressure"].stringValue

            var weatherArray: NSArray = [temp, humidity, pressure]
            var temperature: AnyObject = temp
        }

}

让我知道这是否适合你。

假设您的其余代码是正确的,您所犯的错误是对 NSURLSessionDataTask.resume() 的调用是异步的。在进行网络调用时它将 return (在 array 已填充您提供的完成块中的结果之前)。因此 return array 将正确地 return 您在上面声明的空数组。

要纠正此问题,请让您的 getZipCodeinURL return 什么都不做。在完成块内,调用另一个将使用数组 do work 的函数(例如调用 didFinishLoadingArray)。在 self.array = ... 之后拨打此电话。然后更改 enterButton 函数以仅启动数据检索。它看起来像这样:

var array: [String] = []

func getZipCodeinURL(zipCode: String) {
        let urlPath = "http://api.openweathermap.org/data/2.5/weather?zip=\(zipCode),us&units=imperial"
        let url: NSURL = NSURL(string: urlPath)!
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
        if error != nil {
            // If there is an error in the web request, print it to the console
            println(error.localizedDescription)
            return
        }
        var err: NSError?
        var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
        if err != nil {
            // If there is an error parsing JSON, print it to the console
            println("JSON Error \(err!.localizedDescription)")
            return
        }
        let json = JSON(jsonResult)
        var temp = json["main"]["temp"].stringValue
        var humidity = json["main"]["humidity"].stringValue
        var pressure = json["main"]["pressure"].stringValue
        self.array = [temp, humidity, pressure]
        didFinishLoadingArray()
    })
    task.resume()
}

@IBOutlet weak var pressureLabel: UILabel!
@IBOutlet weak var humidityLabel: UILabel!
@IBOutlet weak var tempLabel: UILabel!
@IBAction func enterButton(sender: AnyObject) {
    var zipCode = zipcodeText.text
    getZipCodeinURL(zipCode)       
}

func didFinishLoadingArray() {
    var temperature: AnyObject = self.array[0]
}

如果您以这种方式更新 UI,您还需要确保在主线程上执行此操作。查看如何操作。