2016-07-08 6 views
0

はのtableViewで、その後の解析迅速な解析クエリの上限

func getUsernames() 
    query.limit = self.limit 
    query.findObjectsInBackgroundWithBlock //display on TableView 
    self.usernamesArray.append(someuser) 
    self.tableView.reloadData() 
} 

からオブジェクトを引くための設定と限界以下使用して迅速 で解析query.limitについての質問を得た:willDisplayCell

if indexPath.row == self.usernamesArray.count - 1 { 

        self.limit += 5 
        self.getUsernames() 
    } 

とviewDidAppearで

これは問題なく動作します。私のテーブルが2番目の最後のセルをスクロールするたびに、別の5が用意されています。これは私が期待したものです! 問題は、usernamesArray.countの合計値が50で、最後のセル(50番目のセル/カウント)が到達/スクロールしたときにtableView:willDisplayCellが呼び出され続け、self.limitが55,60,65それは配列の最後のセルまたは最後のデータに達すると停止しません。 LTEデータを使用し続け、query.limitの数値が5ずつ増えます(利用可能な配列の値がもうない場合) 私はこれを正しくやっていますか?あるいは私は別のアプローチを試みるべきですか? 迅速なマスターに感謝します!ありがとう

答えて

0

いいえ、あなたは正しくしていません。まず、制限を増やしてクエリを実行するだけで、既に持っているデータのコピーがもう1つ追加されます。新しいクエリごとにオフセット(skip)を変更する必要があります。

返されたアイテムの数を確認するには、レスポンスを確認する必要があります。返されるアイテムの数がリクエストの制限よりも小さい場合は、データの最後にいることを知っており、これ以上のリクエストはしないでください。スクロールするときに、他に何もロードできないようにフラグを設定します。

0

この情報をすべて処理するresultSetクラスを作成する方が簡単だとわかりました。

class ParseResultSet: NSObject { 

    var limit = 20 
    var skip = 0 
    var total = 0 
    var limitReached = false 

    var orderByAscendingKey: String? 
    var orderByDescendingKey: String? 

    var searchActive: Bool? 

    func increaseSkipByLimit() { 
     skip += limit 
    } 

    func increaseTotal(byNumber: Int) { 
      total += byNumber 
      if byNumber == 0 { 
       self.limitHasBeenReached() 
       skip = total 
      } 
      else { 
       self.increaseSkipByLimit() 
      } 
    } 

    func limitHasBeenReached() { 
     limitReached = true 
    } 

} 

私は、Parseのオブジェクトを完成ブロックで取得する方法を使用します。私は限界に達しているかどうかを確認し、それが私の場合は

func getObjects(classname: String, include: [String], completion: @escaping (_ result: [PFObject]) -> Void) { 

    if self.resultSet.limitReached == false || self.resultSet.searchActive == true { 
     fetchObjectsFromClass(parseClass: classname, include: include, completion: { [weak self] (objects) in 
      self?.resultSet.increaseTotal(byNumber: objects.count) 
      completion(objects) 
     }) 
    } 
    else { 
     print("LIMIT REACHED") 
    } 
} 

を持っていない場合は、合計をインクリメントし、fetchObjectsFromClassは、クエリが生成され、PFObjectsの配列を返すグローバル関数です。

これで、あなたは何をする必要があるかを知ることができます。