2017-03-28 54 views
-2

我正在實現一種方法,用於在表視圖到達底部時加載從sql服務器返回的更多結果。Swift tableview加載更多數據

我面臨的問題是getData()方法在循環中調用,我不知道爲什麼。

日誌重複下面的輸出,直到應用程序被終止:

索引路徑:12
最後一個元素:12
索引路徑:12
最後一個元素:12

我懷疑它是創建循環的那個,但我無法弄清楚要改變什麼。

任何這幫助是非常讚賞

這是我willDisplayCell方法:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     let lastElement = id.count - 1 
     if indexPath.row == lastElement { 

      print("Index Path:\(indexPath.row)") 
      print("Last Element: \(lastElement)") 
       limitf = "\(lastElement)" 
       getData() 
     } 
    } 

,我使用來獲取數據的功能:

func getData(){ 

     let defaults = UserDefaults.standard 
     let userID = defaults.string(forKey: "id") 

     if(limitf == ""){ 
     id.removeAll() 
     firstname.removeAll() 
     lastname.removeAll() 
     fbid.removeAll() 
     image.removeAll() 
     totalratings.removeAll() 
     mobile.removeAll() 
     } 

     let url = NSURL(string: "https://www.****/getapplications.php?&jobid=\(jobid)&limitf=\(limitf)") 
     // print(url!) 
     let task = URLSession.shared.dataTask(with: url as! URL) { (data, response, error) -> Void in 
      if let urlContent = data { 
       do { 
        if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] { 
         var i = 0 
         while i < jsonResult.count { 

          self.id.append(jsonResult[i]["id"]! as! String) 
          self.firstname.append(jsonResult[i]["firstname"]! as! String) 
          self.lastname.append(jsonResult[i]["lastname"]! as! String) 
          self.fbid.append(jsonResult[i]["fbid"]! as! String) 
          self.image.append(jsonResult[i]["image"]! as! String) 
          self.totalratings.append(jsonResult[i]["totalratings"]! as! String) 
          self.mobile.append(jsonResult[i]["mobile"]! as! String) 

          i = i + 1 
         } 
        } 
       } catch { 
        print("JSON serialization failed") 
       } 
      } else { 
       print("ERROR FOUND HERE") 
      } 

      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 

     } 

     task.resume() 



    } 
} 
+0

您是否試過添加一個標誌來檢測'getData'何時運行,以便它在標誌指示進程已經在運行時只返回?這樣,如果'getData'被連續調用兩次,它仍然只會運行一次。 – Fahim

回答

1

如果服務器上只有12條記錄,並且屏幕上可以看到第12條記錄,則每次顯示時都會調用getData()。服務器可能不會返回更多記錄(因此計數將保持爲12),並且對.reloadData()的調用將導致12條記錄再次顯示,這將在12日再次調用getData(),依此類推。 。

當沒有收到新記錄時,您不應該調用reloadData()。

0

您在willDisplayCell中調用正在顯示的最後一個單元格的getData()然後清除內容並重新加載表格。這意味着最後的單元總是被調用來重新加載數據 - 這就是爲什麼它保持循環。

當你最後一行被加載時,你應該做的是檢測,但是當你調用getData()而不是清除現有數據時,你應該追加新的數據行並使用insertRowsAtIndexPaths來更新你的實現代碼如下。

0

你的問題是你在getData()中加載self.tableView.reloadData()。 這個方法意味着它會再次在tableView委託中運行這些方法。 只要你把self.tableView.reloadData()帶走,這個循環就會結束。