2017-07-21 2 views
2

J'essaie d'analyser les données JSON en utilisant SwiftyJSON dans un tableau à utiliser dans mon TableView. Cependant, même si je peux demander les données et les analyser dans un tableau, je ne peux pas le renvoyer à partir de la fonction getObjects car cela est fait de manière asynchrone. J'ai essayé d'utiliser un gestionnaire d'achèvement, et après avoir suivi plusieurs tutoriels, il semble que je manque quelque chose.Gérer la requête asynchrone Alamofire en utilisant SwiftyJSON

Est-ce que quelqu'un sait comment je peux retourner le tableau à utiliser dans mon TableViewController?

Table View Controller

let objects = [Objects]() 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    let urlString = "URLSTRING" 
    objects = dataManager.getObjects(urlString) 
    print("objects in view controller products array \(objects.count)") 
    self.tableView.reloadData 
} 

Demande Fonctions

class DataManager { 

    func requestObjects(_ stringUrl: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) { 
     print("Request Data") 
     Alamofire.request(stringUrl, method: .get).validate().responseJSON { response in 
      switch response.result { 
       case .success(let value): 
        let json = JSON(value) 
        print("responce success") 
        success(json) 
       case .failure(let error): 
        print(error) 
      } //End of switch statement 
     } //End of alamofire request 
    } //End of request function 

    func getObjects(_ urlString:String) -> [Object] { 
     var objects = [Object]() 

     requestObjects(urlString, success: { (JSONResponse) -> Void in 
      let json = JSONResponse 

      for item in json["items"] { 
       let title = item.1["title"].string 
       objects.append(Object(title: title!)) 
      } 
      print("Number of objects = \(objects.count)") 
     }) { 
      (error) -> Void in 
      print(error) 
     } 
     print(objects) // Prints empty array 
     return objects // Array is empty 
    } 
} 

Répondre

1

Vous devez utiliser completionHandler pour renvoyer des données à TableViewController.

func getObjects(completionHandler : @escaping ([Object]) ->(),_ urlString:String) -> [Sneaker] { 
    var objects = [Object]() 

    requestObjects(urlString, success: { (JSONResponse) -> Void in 
     let json = JSONResponse 

     for item in json["items"] { 
      let title = item.1["title"].string 
      objects.append(Object(title: title!)) 
     } 
     completionHandler(objects) 
     print("Number of objects = \(objects.count)") 
    }) { 
     (error) -> Void in 
     print(error) 
    } 
    print(objects) // Prints empty array 
    return objects // Array is empty 
} 

}

Dans votre TableViewController

dataManager.getObject(completionHandler: { list in 
     self.objects = list 
    }, urlString) 

Il pourrait y avoir une erreur de syntaxe i na pas le tester