无法从函数中检索填充的数组
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,您还需要确保在主线程上执行此操作。查看如何操作。
我有一个函数 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,您还需要确保在主线程上执行此操作。查看如何操作。