私のいずれかで境界を超えたインデックス例外が発生してUITableViewsいますが、マルチスレッドの問題が原因である可能性があります。これが私が信じていることです:
- があり、
UITableViewそのデータ ソースは通常のNSMutableArrayです。 - これ
NSMutableArrayはUITableView、API 応答の内容で数秒ごとに更新されます。 - 各更新の後、
UITableViewの reloadData が呼び出され、ユーザーが API サーバーからの新しいデータを確認できるようになります。 - 境界を超えたインデックスの例外がスローされることがあります。
これが私のコードです:
-(NSMutableArray*) currentBetEvents
{
return currentMarketId == nil ? [[BFOpenBetsModel sharedInstance] betEvents] : filteredBetEvents;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSArray *betEvents = [self currentBetEvents];
return [betEvents count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSArray *betEvents = [self currentBetEvents];
id obj = [betEvents objectAtIndex:indexPath.section] // this is where it blows up
基本的に、betEvents 構造体のインデックス 0 にあるオブジェクトにアクセスしようとすると、例外が発生します。
私が信じていることは次のとおりです。
reloadDataで呼び出されますUITableViewnumberOfSectionsInTableView:が呼び出され、値 > 0 が返されます。- ルージュ スレッドが到着し、
UITableViewのデータ ソースを消去します。 cellForRowAtIndexPath:呼び出されて爆撃します。
これが起こらないようにする方法はありますか?テーブルの更新中にデータ ソースが更新されないようにするために、データ ソースに対していくつかのプリミティブ ロックの使用を開始する必要がありますか?
編集 currentBetEvents によって返されるデータ構造を変更する方法をもう一度見てみると、次のコードの結果として、filteredBets と betEvents をクリアできるように見えます。
[[NSNotificationCenter defaultCenter] postNotificationName:kUserLoggedOutNotification object:nil];
この通知は、ユーザーがログアウトするたびに投稿されます。ユーザーがアプリからログアウトするたびに、filteredBets 配列と betEvents 配列をクリアする必要があります。次のようなことが起こる可能性はありますか。
reloadDataで呼び出されますUITableViewnumberOfSectionsInTableView:が呼び出され、値 > 0 が返されます。- ユーザーがログアウトすると、通知が開始され、データ構造が消去されます。
cellForRowAtIndexPath:呼び出されて爆撃します。
ありがとう、
ショーン