我很难通过我的parseJson()函数更改我的全局数组monthlyAvgArray。当我运行调试器时,它显示它在某一点上有值,但是当我尝试在函数外部访问它时,它表示它是空的。我已经尝试从我的函数返回一个数组并将其设置为等于全局数组,但这也没有用。
这是我的全局数组:
//declaring the dynamic arrays that will hold the information that is parsed
//will be using the same two arrays for each plant
var dateArray = [String]()
var monthlyAvgArray = [Double]()
这是我的parseJson(),它接收URL的字符串。
func parseJson(URL_String:String) {
let url = URL(string: EBR_String)
//var monthlyDoubleArray = [Double]()
// Load the URL
URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
// If there are any errors don't try to parse it, show the error
guard let data = data, error == nil else { print(error!); return }
let decoder = JSONDecoder()
do{
let plantData = try decoder.decode([Plant].self, from: data)
//get each plant dictionary in plantData array of plant dictionaries
for var eachPlant in plantData {
// check to see if any values of the 30 day avg are null
if (eachPlant.monthlyAVG == nil)
{
//set null values to
eachPlant.monthlyAVG = "0"
}
//print(eachPlant.date)
// print(eachPlant.monthlyAVG!)
let monthlyDouble = NSString(string: eachPlant.monthlyAVG!).doubleValue
let monthlyDouble2 = Double(round(100*monthlyDouble)/100)
// monthlyDoubleArray.append(monthlyDouble2)
self.monthlyAvgArray.append(monthlyDouble2)
//self.dateArray.append(eachPlant.date)
//print(monthlyDouble)
}
// at this point my array has values
print(self.monthlyAvgArray)
//print(self.dateArray)
}
catch let err{print(err)}
}).resume()
//at this point my array does not have values
print(monthlyAvgArray)
}
我在viewDidLoad()中调用我的parseJson()函数:
override func viewDidLoad() {
super.viewDidLoad()
//Initiatte calling the items download
// parseJson(URL_String: EBR_String)
parseJson(URL_String: EBR_String)
SetGraph ()
}
我之前确实将全局数组设置为私有,因为我不希望它们在其他View Controller中访问,但我确实希望能够访问此特定View Controller中的任何位置。我只是想知道为什么我在一个点上获得数组中的值,之后什么都没有。谁能帮我吗?感谢。
答案 0 :(得分:0)
看起来最后一个print语句没有任何值的原因是因为数组仅在请求完成后附加到。当dataTask以异步方式运行时,您将首先打印最后一个print语句,然后在完成处理程序内打印一个。因此,在完成块之前打印空数组并且在完成块数组中有数据是预期的。