1

私のいずれかで境界を超えたインデックス例外が発生してUITableViewsますが、マルチスレッドの問題が原因である可能性があります。これが私が信じていることです:

  1. があり、UITableViewそのデータ ソースは通常のNSMutableArrayです。
  2. これNSMutableArrayUITableView、API 応答の内容で数秒ごとに更新されます。
  3. 各更新の後、UITableViewの reloadData が呼び出され、ユーザーが API サーバーからの新しいデータを確認できるようになります。
  4. 境界を超えたインデックスの例外がスローされることがあります。

これが私のコードです:

-(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 にあるオブジェクトにアクセスしようとすると、例外が発生します。

私が信じていることは次のとおりです。

  1. reloadDataで呼び出されますUITableView
  2. numberOfSectionsInTableView:が呼び出され、値 > 0 が返されます。
  3. ルージュ スレッドが到着し、UITableViewのデータ ソースを消去します。
  4. cellForRowAtIndexPath:呼び出されて爆撃します。

これが起こらないようにする方法はありますか?テーブルの更新中にデータ ソースが更新されないようにするために、データ ソースに対していくつかのプリミティブ ロックの使用を開始する必要がありますか?


編集 currentBetEvents によって返されるデータ構造を変更する方法をもう一度見てみると、次のコードの結果として、filteredBets と betEvents をクリアできるように見えます。

[[NSNotificationCenter defaultCenter] postNotificationName:kUserLoggedOutNotification object:nil];

この通知は、ユーザーがログアウトするたびに投稿されます。ユーザーがアプリからログアウトするたびに、filteredBets 配列と betEvents 配列をクリアする必要があります。次のようなことが起こる可能性はありますか。

  1. reloadDataで呼び出されますUITableView
  2. numberOfSectionsInTableView:が呼び出され、値 > 0 が返されます。
  3. ユーザーがログアウトすると、通知が開始され、データ構造が消去されます。
  4. cellForRowAtIndexPath:呼び出されて爆撃します。

ありがとう、

ショーン

4

1 に答える 1

2

確かにスレッドの問題のように聞こえます。次のようなことを試してみてください:

// view controller
@synchronized([[BFOpenBetsModel sharedInstance] betEvents])
{
    [self.tableView reloadData];
}

…

// data model
@synchronized(_betEvents) // or whatever the instance variable -betEvents returns is
{
    [_betEvents addObject:whatever];
}
于 2012-11-08T03:21:59.563 に答える