2016-11-02 5 views
-1

実際には、TableViewにデータを設定する必要があります。得られる文字列は、WebServiceでPOSTリクエストを行う関数上にあります。 self.request()機能で関数のTableView Swift 3の値を設定する

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() 
} 

私は正常に動作POSTリクエストを持っている:

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

最初の部分は正常に動作します:

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

そしてprint("Obj: \"\(obj["KeyName"] as! String)\"")は、コンソール上の文字列を私に示しているが、 TableViewでself.names.append(obj["KeyName"] as! String)のデータを表示しても、最初の部分だけが表示されません。間違っていますか?

+0

私はそれが非同期だからだと思います。したがって、新しい名前を取得したら、 'MyTable.reloadData()'を実行する必要があります。 'MyTable' =>' myTable'のように、大文字で始まるvarの命名も避けてください。 – Larme

+0

ありがとうございました。 –

答えて

1

データソースにデータを更新するたびに、新しいコンテンツを表示するためにtableViewをリロードする必要があります。 forループの後にテーブルのリロードを追加すると、tableViewが更新されます。 Alamofireの呼び出しは、別のスレッド(メインスレッド以外)で非同期に実行されるため、メインスレッドのtableViewを更新してください。あなたの例では

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

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

ありがとう、それは私のために働く。 –

+0

助けてくれてうれしいです。答えがあなたの問題を解決するのに役立った場合は、それを答え/ upvoteとしてマークすることができます。 –

関連する問題