2

だから私はUITableViewDataSourceを使用してプロトコルを実装しますNSFetchedResultsController

次に、コア データベースの内容を変更しNSFetchedResultsController、tableView を更新します。

tableView がデータのリロードをいつ完了したかを知る方法はありますか?

REST 実装に対してキャッシュする複雑なデータ モデルがあり、画面を埋めるためにさらにデータを取得する必要があるかどうかを判断するのは困難です (画面は読み込まれた生データに対して複雑なフィルターを使用している可能性があるため)。また、UITableViewCellオブジェクトが同じ高さであるとは限りません。

簡単な答えは、単にデータをコア データにダンプし、 を使用しNSFetchedResultsControllerてデータを に提供することでしたUITableView

仕組みは次のとおりです。

  • 「データ読み込み中」メッセージを表示する tableview.tableFooterView を追加しました。
  • REST API からデータのバッチをロードし、それを使用して Core Data オブジェクトを更新します。
  • これにより、トリガーするcontrollerDidChangeContentメソッドがトリガーされ、次に tableView reloadData がトリガーされます (例:)

    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    {
       [self.tableView reloadData];
    }
    
  • 次に、基本的に「チェック」して、次のようなメソッドを呼び出して、250 ミリ秒後にフッターがまだ表示されているかどうかを確認します。

    [self performSelector:@selector(checkIfFooterViewIsVisible) withObject:nil afterDelay:0.25];
    
    - (void)checkIfFooterViewIsVisible
    {
      BOOL viewVisible = CGRectIntersectsRect(self.tableView.bounds,self.tableView.tableFooterView.frame);
      if (viewVisible)
      {
        [self getMoreData];
      }
    
  • また、スクロールするたびにフッターが表示されているかどうかも確認します。

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        [self checkIfFooterViewIsVisible];
    }
    
  • データの「最後のバッチ」をロードすると、実際にはtableViewFooterビュー オブジェクトがテーブルから削除されるだけです (そのため、表示されなくなります)。

ユーザーがそれを「必要とする」場合にのみ、より多くのデータをプルする必要があるかどうかを判断できるため、答えはクールです。最初のバッチで表示されるデータが少なかったか、下にスクロールしてより多くのデータが必要になったためです。の現在の配置を確認するtableFooterViewと、画面上に十分なデータが「描画」されているかどうかがわかります。

問題は次のとおりです。

[self performSelector:@selector(checkIfFooterViewIsVisible) withObject:nil afterDelay:0.25];

遅延の設定が速すぎるUITableViewと、画面を更新する (そしてフッターの位置を変更する) 時間がなくなります。更新が遅すぎると、アプリがデータをロードするときに「途切れる」ように感じられ、データのロードが遅くなる可能性があります。しかし、異なる iOS デバイス (および異なるネットワーク カバレッジ) は、タイミングがわずかに異なることを意味するため、「UITableView更新して少し後で確認する」がほとんどの場合に機能しますが、これはよりスムーズに機能する可能性があると感じています.

オブジェクトのロードが「完了」UITableViewしていると判断できる方法はありますか? (少なくとも次回スクロールが動くまでは?)。この奇妙な遅延を追加することはうまく機能しますが、操作が完了したことを明確に知っていれば、よりクリーンに機能します。UITableViewUITableViewCell[tableview reloadDate]

4

0 に答える 0