UITableViewDataSource和多线程

时间:2012-11-08 00:49:34

标签: objective-c ios multithreading cocoa-touch uitableview

我在我的UITableViews之一中遇到超出边界范围的索引,而我认为可能会导致一些多线程问题。以下是我认为正在发生的事情:

  1. 我有一个UITableView,它的数据来源是常规NSMutableArray
  2. 支持NSMutableArray的{​​{1}}每隔几秒就会更新一次API响应内容。
  3. 每次更新后,都会调用UITableView的reloadData以确保用户从API服务器中看到新数据。
  4. 有时会抛出超出边界范围的索引。
  5. 这是我的代码:

    UITableView

    基本上,我在尝试访问索引0处的betEvents结构中的对象时遇到异常。

    相信正在发生的事情是:

      -(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 上调用
    1. reloadData 调用
    2. UITableView,返回值> 0
    3. 一个rouge线程到达并清除numberOfSectionsInTableView:的数据源。
    4. UITableView被调用并且它被炸弹。
    5. 有没有办法确保不会发生这种情况?我是否需要开始在数据源上使用一些原始锁,以确保在更新表时不会更新它?


      修改 再看看currentBetEvents返回的数据结构是如何被改变的,看起来像过滤后的&由于以下代码,betEvents可以被清除:

      cellForRowAtIndexPath:

      只要用户注销,就会发布此通知。每当用户退出应用程序时,我需要清除filteredBets和betEvents数组。是否有可能发生以下情况:

        [[NSNotificationCenter defaultCenter] postNotificationName:kUserLoggedOutNotification object:nil]; 上调用
      1. reloadData 调用
      2. UITableView,返回值> 0
      3. 用户注销,启动通知&清除数据结构。
      4. numberOfSectionsInTableView:被调用并且它被炸弹。

      5. 谢谢,

        肖恩

1 个答案:

答案 0 :(得分: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];
}