具有实时数据的 UITableView 也同时具有用户交互
Posted
技术标签:
【中文标题】具有实时数据的 UITableView 也同时具有用户交互【英文标题】:UITableView with live data also has user interaction same time 【发布时间】:2011-10-02 08:54:40 【问题描述】:我正在进行概念验证项目。那就是使用 UITableView 来显示一些实时数据。 “实时数据”正在应用程序中与传感器信息实时融合。
在 UITableView 用一些 NSMutableArray 数据渲染后,NSMutableArray 每 1 秒更新一次传感器数据 appprox,同时 UITableView 也有用户交互。
我的问题是,根据上文,在 UITableView 上使用实时数据的最佳方法是什么?
任何建议,样品将不胜感激。
【问题讨论】:
Suz 的回答应该适合你。 【参考方案1】:苹果文档中的SeismicXML parser sample code 做了类似的事情。它从服务器获取有关地震的“实时”(即更改)信息,并在新信息到达时通过 NSNotification 更新数据源。 UITableView 根据对 NSMutableArray 何时更改的键值观察来重新加载其数据。使用 [tableView reloadData] 完成重新加载。
还有用户与表格的交互:用户可以选择 tableViewCell 并选择点击链接以获取更多信息。
如果您担心控制协调:您要避免的是用户点击表格,dataArray 发生更改,-tableView:didSelectRowAtIndexPath:
方法尝试同时访问数据。有两种选择:要么在数据更新时阻止在表中进行选择,要么在行选择发生时阻止数据更新。
您可以通过设置tableView.allowsSelection=NO
来阻止与表格的交互。您可以使用 key-value-observing 选项了解数据何时更新:NSKeyValueObservingOptionPrior
。但这种方法通常会失分,因为您可能会打断用户想要做的事情。
另一种选择是通过设置几个布尔值来延迟数据更新:isSelecting 和 dataNeedsReloading。流程将类似于:
用户点击表格,isSelecting=YES
如果有新数据进来,
if (isSelecting)
[tempArray addObject:newData];
dataNeedsReloading=YES;
然后在选择过程完成时,复位isSelecting=NO
,检查dataNeedsReloading
标志,如果需要,将数组联合并重新加载表。完成后,重置dataNeedsReloading=NO
。同时使用-removeAllObjects
重置 tempArray。
【讨论】:
感谢您的回答,那么数据呢?我的意思是我有一个 NSMutableArray 来保存数据,对吗?如果我尝试同步数据,用户也会同时在屏幕上进行操作。该应用程序可能会崩溃。看来我需要一些锁定机制来防止对单个 repo 对象的并发访问。 UITableViews 有一个 BOOL 属性“allowsSelection”。您可以在调用 [tableView reloadData] 之前将其设置为“NO”。然后将其设置回“是”。这将在重新加载时关闭与表格的交互。【参考方案2】:如果您想在每次数据源更改时更新UITableView
,请发送reload
消息。
【讨论】:
托布,感谢您的回复。请参阅我写给 suz 答案的评论。【参考方案3】:只要传感器有新数据可用,就在主线程上调用 addData 方法。
-(void) addData:(NSString*)newDataFeild
@synchronized(self)
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[_data count] inSection:0];
[_data addObject:line];
[self reloadData];
[self scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.text = [_data objectAtIndex:indexPath.row];
return cell;
【讨论】:
以上是关于具有实时数据的 UITableView 也同时具有用户交互的主要内容,如果未能解决你的问题,请参考以下文章
删除和插入具有不同高度的单元格时,UITableView 动画故障