2017-05-10 3 views
1

J'ai du mal à faire un appel Alamofire et à ajouter les données JSON à un tableau global, et je commence vraiment à insister.L'accès Alamofire ajoute des données à la variable globale

Je comprends que lorsque vous effectuez des appels d'API, cela se fait dans un thread asynchrone. Cependant, après avoir fait des recherches sur le sujet, j'ai suivi les recommandations, mais je me perds parce que dans tous les cas, ils impriment seulement les données, et cela fonctionne, mais quand j'essaie d'ajouter les données à un tableau, je suis toujours obtenir un nombre de 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!) 
     } 
    } 
} 

Est-ce que quelqu'un sait ce que je fais mal? ou si c'est réalisable en premier lieu, sinon, existe-t-il une alternative pour réaliser ce que je suis après?

Merci beaucoup.

Répondre

1

Si vous voulez que le code soit exécuté directement après getJson, vous devez placer ce code dans la fermeture.

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

Bien que cela fournisse une solution, juste par curiosité, si je ne voulais pas que le code s'exécute tout de suite, y a-t-il une autre solution? –

+0

Quand voulez-vous que le code s'exécute? –