Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法从函数中检索填充的数组_Ios_Swift_Nsarray_Nsurlsession - Fatal编程技术网

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

Ios 无法从函数中检索填充的数组,ios,swift,nsarray,nsurlsession,Ios,Swift,Nsarray,Nsurlsession,我有一个函数getZipCodefromURL,它从天气数据服务中检索数据,解析json,并将信息排序到我的数组中。在我的应用程序中,我设置了一个文本字段、一个按钮和标签,这样用户可以在文本字段中输入他或她的邮政编码,然后点击按钮,该按钮将用他们所在地区的天气信息更新标签 我认为我面临的问题是我的函数设置方式或调用方式。在我的enterButton函数中,我想从getZipCodeinURL检索填充的数组,但是当我调用它时,它返回空的,并且我无法对它进行索引。到目前为止,这就是我所拥有的:

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

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

    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]
            }
是否有人知道如何将填充的
数组
从我的函数中正确检索到我的
enterButton
函数中

查看并特别关注响应处理

基本上,您可以进行
GET
调用,并在该调用得到响应后告诉代码执行。Alamofire还直接与SwiftyJSON集成。让你的回答变得非常简单

你可以很容易地做这样的事情

@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()
的调用是异步的。它将在进行网络调用时返回(在您提供的完成块中用结果填充数组之前)。因此,
返回数组
将正确返回您在上面声明的空数组

要纠正此问题,请让您的
getZipCodeinURL
不返回任何内容。在完成块内,调用另一个函数(如make a
didfishloadingarray
),该函数将使用数组执行操作。在
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,还需要确保在主线程上执行此操作。查看如何执行此操作。

您需要对异步调用进行一些研究,重点是Internet调用。我看不出您的函数在哪里返回数组。我很糟糕,忘了删除我复制和粘贴的一些代码。编辑答案以适应。但本质上,您希望在收到呼叫响应后设置变量。因为向web服务器发送调用并获得响应需要时间。我如何才能以这种方式在enterButton函数中检索
temp