我很难通过我的parsejson((函数更改我的全局阵列每月averavgarray。当我运行调试器时,它表明它具有一个点的值,但是当我尝试在功能外访问它时,它说它为空。我尝试从功能返回一个数组并将其设置为等于全局数组,但这也不起作用。
这是我的全局数组:
//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 ()
}
我确实更早地将全局数组设置为私有,因为我不希望它们在其他视图控制器中访问,但是我确实希望能够在此特定视图控制器中的任何地方访问。我只是想知道为什么我会在某一时刻获得价值,然后什么都没有。谁能帮我吗?谢谢。
看起来上一个打印语句没有任何值的原因是因为数组仅在请求完成后附加到。当dataTask异步运行时,您将首先打印最后一个打印语句,然后在完成处理程序的内部打印。因此,在命中完成块之前打印空数组,并在完成块中具有数据。