gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:01:16 24 4
gpt4 key购买 nike

我有一个函数 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函数中?

最佳答案

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

要纠正此问题,请让您的 getZipCodeinURL 不返回任何内容。在完成 block 内,调用另一个函数(例如,创建一个 didFinishLoadingArray),该函数将使用数组 do work 。在 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,您还需要确保在主线程上执行此操作。查看如何做到这一点。

关于ios - 无法从函数中检索填充的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32960810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com