具有实时数据的 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 也同时具有用户交互的主要内容,如果未能解决你的问题,请参考以下文章

Django 实时作业

具有高分辨率的实时 FFT,同时保持低延迟

删除和插入具有不同高度的单元格时,UITableView 动画故障

具有多行输入字段的 UITableViewCell?

如何打印具有多个数据的标题和uitableview的uiwebview

从具有 id 的 UItableview 单元格中获取数据