Alamofire access将数据追加到全局变量
问题描述:
我在做一个Alamofire调用并将JSON数据附加到全局数组时遇到了一些麻烦,我真的开始强调。Alamofire access将数据追加到全局变量
我明白,在进行API调用时,它是在异步线程中完成的。然而,在对此事进行研究之后,我遵循了这些建议,但我迷失了方向,因为在每个人的例子中,他们只打印数据,而且工作正常,但是当我尝试将数据附加到数组时,我仍然得到0的计数。
class SomeClass: UIViewController {
var categories = [Int]()
@IBOutlet var labels: [UILabel]!
override func viewDidLoad() {
super.viewDidLoad()
self.getJSON() { response in
self.populateArray(json: response)
}
//This prints 0 :(
print("Size: \(categories.count)")
var count = 1
for lbl in labels {
for var i in 0..<categories.count {
//Obviously this never computes so they all are black instead of some being red
lbl.tintColor = count == categories[i] ? UIColor.Red : UIColor.Black
}
}
public func getJSON(completionhandler: @escaping (JSON) ->())() {
Alamofire.request("some url").responseJSON { response in
switch response.result {
case .success:
let jsonData = JSON(data: response.data!)
completionHandler(jsonData)
case .failure(let error):
print(error)
}
}
}
public func populateArray(json: JSON) ->() {
//JSON still prints fine
print(json)
for (index, subJson):(String, JSON) in json {
//Again, prints fine
print(subJson["catID"].int!)
self.categories.append(subJson["catID"].ind!)
}
}
}
有没有人知道我在做什么错?或者如果这是可以实现的,那么如果没有,是否有替代方案来实现我所追求的目标?
很多谢谢。
答
如果你想在getJson
之后直接执行该代码,那么你需要将该代码放入闭包中。
self.getJSON() { response in
self.populateArray(json: response)
print("Size: \(categories.count)")
var count = 1
for lbl in labels {
for var i in 0..<categories.count {
lbl.tintColor = (count == categories[i] ? UIColor.Red : UIColor.Black)
}
}
}
虽然这提供了一个解决方案,出于好奇,如果我不想直接执行代码,有没有另一种方法? –
你想要什么时候运行代码? –