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) 
     } 
    } 
} 
+0

虽然这提供了一个解决方案,出于好奇,如果我不想直接执行代码,有没有另一种方法? –

+0

你想要什么时候运行代码? –