我在我的UITableViews
之一中遇到超出边界范围的索引,而我认为可能会导致一些多线程问题。以下是我认为正在发生的事情:
UITableView
,它的数据来源是常规NSMutableArray
。NSMutableArray
的{{1}}每隔几秒就会更新一次API响应内容。UITableView
的reloadData以确保用户从API服务器中看到新数据。这是我的代码:
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
上调用reloadData
调用UITableView
,返回值> 0 numberOfSectionsInTableView:
的数据源。UITableView
被调用并且它被炸弹。有没有办法确保不会发生这种情况?我是否需要开始在数据源上使用一些原始锁,以确保在更新表时不会更新它?
修改 再看看currentBetEvents返回的数据结构是如何被改变的,看起来像过滤后的&由于以下代码,betEvents可以被清除:
cellForRowAtIndexPath:
只要用户注销,就会发布此通知。每当用户退出应用程序时,我需要清除filteredBets和betEvents数组。是否有可能发生以下情况:
[[NSNotificationCenter defaultCenter] postNotificationName:kUserLoggedOutNotification object:nil];
上调用reloadData
调用UITableView
,返回值> 0 numberOfSectionsInTableView:
被调用并且它被炸弹。谢谢,
肖恩
答案 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];
}