私が構築しているアプリには多くのテーブルがあります。最初の 15 行のデータをロードしています。ユーザーが下にスクロールすると、次の 15 行のバッチが取得されます。
「カウント」と「スキップ」を受け取る DBAccess 関数をいくつか作成しました。最初にテーブルをロードするとき、カウント = 15、スキップ = 0。ユーザーがスクロールするとき、カウント = 15、スキップ = [配列カウント];
コードは次のようなものです。
- (void)getDataWithCount:(NSInteger)count withSkip:(NSInteger)skip
{
if (skip == 0)
self.dataArray = [[NSMutableArray alloc]init];
[DBAccess getData:self.dataArray withCount:count withSkip:skip handler:^(void)
{
if (no error)
[table reloadData];
}];
}
非常に遅いネットワーク接続で cellForRowAtIndexPath の範囲外の配列がクラッシュします (たとえば、空の配列を超えるインデックス 16。numberOfRowsInSection は [配列数] を返します)。
問題は次のとおりだと思います。
0) 画面に入ります。
1) 15 行をロードする
2) 下にスクロールして、別の 15 をロードします。接続が遅いため、sendAsynchronousRequest db 呼び出しからまだコールバックがありません
3) 別のビューコントローラーに移動します (つまり、画面を離れます。非同期で画面がフリーズしないため、これを行うことができます)。
4) 画面に戻ります。初期画面をロードするとskip = 0が設定されるため、変更可能な配列が初期化され、データベースにヒットします
5) 手順 2 でヒットしたデータベースが返されます。私の可変配列は、ステップ 4 からゼロに設定されました。テーブルをリロードするとき、配列が if(skip == 0)initialise から空になったときに、self.dataArray objectAtIndex:16 などを取得しようとしています。
これは正しいと思いますか?numberOfRowsInSection が [array count]; を返す場合、配列が範囲外になる他の理由はありますか? これを修正するための好ましい方法はありますか?