gpt4 book ai didi

objective-c - UITableViewDataSource 和多线程

转载 作者:行者123 更新时间:2023-11-29 11:06:42 27 4
gpt4 key购买 nike

我在我的一个 UITableViews 中遇到索引越界异常,我认为可能是一些多线程问题。这是我认为正在发生的事情:

  1. 我有一个 UITableView,它的数据源是一个普通的 NSMutableArray
  2. 支持我的 UITableView 的这个 NSMutableArray 每两秒更新一次 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

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

相信正在发生的是:

  1. reloadDataUITableView
  2. 上调用
  3. numberOfSectionsInTableView: 被调用,返回值 > 0。
  4. 一个 rouge 线程到达并清除了 UITableView 的数据源。
  5. cellForRowAtIndexPath: 被调用并爆炸。

有什么方法可以确保不会发生这种情况?我是否需要开始对数据源使用一些原始锁以确保在更新表时它不会更新?


编辑再看一下如何更改 currentBetEvents 返回的数据结构,看起来 filteredBets 和 betEvents 可以作为以下代码的结果被清除:

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

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

  1. reloadDataUITableView
  2. 上调用
  3. numberOfSectionsInTableView: 被调用,返回值 > 0。
  4. 用户注销,启动通知并清除数据结构。
  5. cellForRowAtIndexPath: 被调用并爆炸。

谢谢,

肖恩

最佳答案

听起来绝对像是线程问题。你可以尝试这样的事情:

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



// data model
@synchronized(_betEvents) // or whatever the instance variable -betEvents returns is
{
[_betEvents addObject:whatever];
}

关于objective-c - UITableViewDataSource 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com