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 adidfishloadingarray
),该函数将使用数组执行操作。在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
?