2016-09-26 18 views
0

私のSwift 3.0プロジェクトにtableViewControllerを使用しています。私はリクエストからテーブルビューの行数を取得したいので、その目的でAlamofire 4.0を使用しています。tableViewメソッドのリクエストから行数を取得する方法は?

私はあなたがcompletionHandlerHow to return value from Alamofire)を設定する必要がAlamofireから値を返すためにそれを見たが、Xcodeは私がtableView方法でそれを設定することはできません。

var numRows = 0 

func setRows(numRows : Int){ 
    self.numRows = numRows 
} 

func getRows() -> Int{ 
    return self.numRows 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    var JSON = [[String : AnyObject]]() 

    Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in 

     switch(response.result) { 
      case .success(_): 
       JSON = response.result.value as! [[String : AnyObject]]! 
       self.setRows(numRows: JSON.count) 
       break 

      case .failure(_): 
       print("Error") 
       break 
     } 
    } 

    return self.getRows() 
} 

が、私はそれを動作させることができないです:

これは私がセット/ getメソッドを試してみましたコードです。私はAlamofire要求が非同期であり、私が直面している問題ですが、tableViewのcompletionHandlerを設定することができないことを知っています。

PS:私はまた、同期Alamofire(making an asynchronous alamofire request synchronous)を作ってみましたが、完了ブロックが再び表示され、私はその方法でそれを設定することが可能であるならば、私は知りません(のtableView方式に設定することはできませんよまたは私は間違った方法でそれをやっている)。

私はtableViewメソッドにcompletion:(Int) -> Voidを追加しようとしましたが、Xcodeはそれを許可していません。

リクエスト後に行数を設定するにはどうすればよいですか?

ありがとうございます!

+0

リターン0と完了ハンドラが呼び出されたときに、ローを設定してください –

答えて

3

私はこのような何かやっている:私はアイテムを取得し、これが小さいのtableView

Alamofire.request(.GET, url, headers: headers, encoding: .JSON) 
     .responseJSON { (response) in 
      print(response) 
      self.positionsTable = response.result.value 
      self.tableView.reloadData() 
    } 
} 
+1

'self.tableView.reloadData()'は私が欠けていたメソッドでした。ありがとうございました! –

2

あなたは間違った方法を考えています。テーブルビューにcompletionHandlerを設定する必要はありません。

viewControllerの仕事は、情報の流れを制御することです。

  • viewControllerをtableViewデリゲートメソッドに準拠させます。
  • すべてのコールバック関数を実装します。
  • viewControllerにalamofireコードを呼び出して、非同期要求を実行させます。
  • viewControllerに完了ブロックを処理させます。
  • 処理されると、すべてのデリゲートメソッドを再度呼び出すために "tableView.reloadData()"を呼び出します。

これにより、tableViewの行数が再度要求され、tableViewの内容全体が更新されます。

また、UIを扱う際には、必ず非同期ネットワーキング方式を使用する必要があります。あなたのUIは、何かが処理中であることをユーザーに認識させ、それが完了したら画面を更新する必要があります。

+0

詳細な説明をありがとうございます。それは私にとっても非常に便利でした:) –

0

をリロード要求からのtableView

var positionsTable = [[String : AnyObject]]() 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return positionsTable.count 
} 

になります項目の

テーブルをどのようにすることができるかの例。それは、データをフェッチし、rowCountを更新するエレガントな機能を作成した後、この関数は、我々のtableview例を更新する

var rowCount = 0 

まず、例えば0である行のプロパティと設定INIT値を作成します。

func elegantFuntionToUpdateRowCount() { 
    var JSON = [[String : AnyObject]]() 

Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in 

    switch(response.result) { 
     case .success(_): 
      JSON = response.result.value as! [[String : AnyObject]]! 
      rowCount = JSON.count 
      tableView reloadData 
      break 

     case .failure(_): 
      print("Error") 
      break 
    } 
} 
} 

numberOfRowsInSectionを実装してください。

ソフトウェアのアーキテクチャーについて少しはお伝えしていますが、これは少しの例です。

関連する問題