だから私は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
していると判断できる方法はありますか? (少なくとも次回スクロールが動くまでは?)。この奇妙な遅延を追加することはうまく機能しますが、操作が完了したことを明確に知っていれば、よりクリーンに機能します。UITableView
UITableViewCell
[tableview reloadDate]