私のいずれかで境界を超えたインデックス例外が発生して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
で呼び出されますUITableView
numberOfSectionsInTableView:
が呼び出され、値 > 0 が返されます。- ルージュ スレッドが到着し、
UITableView
のデータ ソースを消去します。 cellForRowAtIndexPath:
呼び出されて爆撃します。
これが起こらないようにする方法はありますか?テーブルの更新中にデータ ソースが更新されないようにするために、データ ソースに対していくつかのプリミティブ ロックの使用を開始する必要がありますか?
編集 currentBetEvents によって返されるデータ構造を変更する方法をもう一度見てみると、次のコードの結果として、filteredBets と betEvents をクリアできるように見えます。
[[NSNotificationCenter defaultCenter] postNotificationName:kUserLoggedOutNotification object:nil];
この通知は、ユーザーがログアウトするたびに投稿されます。ユーザーがアプリからログアウトするたびに、filteredBets 配列と betEvents 配列をクリアする必要があります。次のようなことが起こる可能性はありますか。
reloadData
で呼び出されますUITableView
numberOfSectionsInTableView:
が呼び出され、値 > 0 が返されます。- ユーザーがログアウトすると、通知が開始され、データ構造が消去されます。
cellForRowAtIndexPath:
呼び出されて爆撃します。
ありがとう、
ショーン