2016-11-02 5 views
-1

Eigentlich muss ich Daten auf meinem TableView setzen, die Strings, die ich bekomme, sind auf eine Funktion, die eine POST-Anfrage auf einem WebService macht.Setzen Sie Werte auf TableView Swift 3 auf Funktion

override func viewDidLoad() { 
    names.append("Data 1") 
    names.append("Data 2") 
    names.append("Data 3") 
    self.request() 
    MyTable.delegate = self 
    MyTable.dataSource = self 
    super.viewDidLoad() 
} 

Auf self.request() Funktion habe ich eine Post-Anforderung, die gut funktioniert:

func request(){ 

    let parameters: Parameters = [ 
     "action": "*", 
     "key":"*": "*" 
    ] 
    Alamofire.request("my_url", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in 
     switch response.result { 
     case .success(let JSON): 
      print("Validation Successful") 
      print(response.result.value) 
      let response = JSON as! NSDictionary 
      let userId = response.object(forKey: "Data")! 
      let data = userId as! NSArray 
      for item in data { // loop through data items 
       let obj = item as! NSDictionary 
       print("Obj: \"\(obj["KeyName"] as! String)\"") 
       self.names.append(obj["KeyName"] as! String) 
      } 
      print(userId) 

     case .failure(let error): 
      print(error) 
     } 
    } 
} 

Der erste Teil funktioniert gut:

names.append("imac") 
names.append("Macbook") 
names.append("iphon") 

Und print("Obj: \"\(obj["KeyName"] as! String)\"") zeigt mir auf der Konsole die Saiten, aber wenn ich es auf dem TableView setze, zeigt self.names.append(obj["KeyName"] as! String) die Daten nicht nur den ersten Teil, mache ich etwas falsch?

+0

Ich denke, das ist, weil es asynchron ist. Also müssen Sie 'MyTable.reloadData()' tun, sobald Sie die neuen Namen erhalten. Vermeiden Sie auch die Benennung von var beginnend mit einem Großbuchstaben (wie 'MyTable' =>' myTable'). – Larme

+0

Danke das war das Problem, Grüße. –

Antwort

1

Wenn Sie Daten in der Datenquelle aktualisieren, müssen Sie Ihr tableView neu laden, um den neuen Inhalt anzuzeigen. Fügen Sie nach der for-Schleife das Reload der Tabelle hinzu und es sollte die tableView aktualisieren. Da Ihr Alamofire-Aufruf asynchron in einem anderen Thread (als dem Hauptthread) ausgeführt wird, aktualisieren Sie die TableView im Hauptthread.

DispatchQueue.main.async(execute: { 
    MyTable.reloadData() 
}) 

In Ihrem Beispiel:

func request(){ 

    let parameters: Parameters = [ 
     "action": "*", 
     "key":"*": "*" 
    ] 
    Alamofire.request("my_url", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in 
     switch response.result { 
     case .success(let JSON): 
      print("Validation Successful") 
      print(response.result.value) 
      let response = JSON as! NSDictionary 
      let userId = response.object(forKey: "Data")! 
      let data = userId as! NSArray 
      for item in data { // loop through data items 
       let obj = item as! NSDictionary 
       print("Obj: \"\(obj["KeyName"] as! String)\"") 
       self.names.append(obj["KeyName"] as! String) 
      } 

      DispatchQueue.main.async(execute: { 
       MyTable.reloadData() 
      }) 

      print(userId) 

     case .failure(let error): 
      print(error) 
     } 
    } 
} 
+0

Vielen Dank, das funktioniert für mich. –

+0

Froh, dass es geholfen hat. Wenn eine Antwort zur Lösung Ihres Problems beitrug, können Sie sie als Antwort markieren/verbessern. –

Verwandte Themen