如何在Swift 4中访问全局数组?

时间:2018-02-25 17:01:33

标签: arrays swift global-variables

我很难通过我的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中的任何位置。我只是想知道为什么我在一个点上获得数组中的值,之后什么都没有。谁能帮我吗?感谢。

1 个答案:

答案 0 :(得分:0)

看起来最后一个print语句没有任何值的原因是因为数组仅在请求完成后附加到。当dataTask以异步方式运行时,您将首先打印最后一个print语句,然后在完成处理程序内打印一个。因此,在完成块之前打印空数组并且在完成块数组中有数据是预期的。