2017-03-28 33 views
-2

テーブルビューが最下部に達したときにSQL Serverから返された結果をさらに読み込むメソッドを実装しています。スウィフトテーブルビュー詳細データのロード

私が直面している問題は、getData()メソッドがループで呼び出され、その理由を理解できないことです。アプリケーションが終了するまで

ログは以下の出力を繰り返し:

インデックスパス:12
最後の要素:12
インデックスパス:12
最後の要素:12

私はループを作成しているものの1つと思っていますが、私は何を変えるべきかは分かりません。

これにどのような援助が大幅に

を高く評価しているこれは私の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'が連続して2回呼び出されると、それはまだ1回だけ実行されます。 – 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()を離しておく限り、このループは終了します。