2017-03-28 58 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()带走,这个循环就会结束。