2016-09-26 28 views
0

我在我的Swift 3.0項目中使用了tableViewController。我想從請求中獲取我的tableview的行數,我正在使用Alamofire 4.0如何從tableView方法的請求中獲取行數?

我看到從Alamofire返回值,你必須設置一個completionHandlerHow to return value from Alamofire),但Xcode中不要讓我把它放在tableView方法。

這是我與集嘗試代碼/ get方法:

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

,但我不能使它發揮作用。我知道Alamofire請求是異步的,並且是我面臨的問題,但我無法在tableView函數上設置completionHandler。

PS:我也試圖讓同步Alamofire(making an asynchronous alamofire request synchronous),但完成塊再次出現,我不能將它設置爲的tableView方法(我不知道是否有可能將其在該方法或者我以錯誤的方式進行)。

我曾嘗試將completion:(Int) -> Void添加到我的tableView方法,但Xcode不允許我這樣做。

在做出請求後應該如何設置行數?

在此先感謝!

+0

返回0並且完成處理程序被調用時設置行 –

回答

3

我在做這樣的事情:項目

表,將在的tableView

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

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

從要求我得到的物品,並重新加載的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

您正在考慮錯誤的方法。你不需要在tableView上設置completionHandler。

viewController的工作是控制信息流。

  • 使您的viewController符合tableView委託方法。
  • 實現所有的回調函數。
  • 讓viewController調用alamofire代碼來執行異步請求。
  • 讓viewController處理完成塊。
  • 處理完畢後,調用「tableView.reloadData()」再次調用所有的委託方法。

這將導致tableView再次請求行數,並更新整個tableView的內容。

另請注意,在處理UI時,應始終使用異步聯網方法。你的用戶界面應該讓用戶意識到正在處理的東西,然後在完成時更新屏幕。

+0

非常感謝您的詳細解釋。它對我來說也非常有用:) –

0

這是小舉例說明如何做到這一點。

首先創建行的屬性和設置初始化值是0,例如:

var rowCount = 0 

之後,創建一個優雅的功能,將獲取數據並更新rowCount,也是這個功能將更新我們的tableview例如:

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

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return rowCount 
} 

這是一個很小的例子,它可能如何做,但嘗試閱讀一些關於軟件架構。

相關問題