2011-10-02 18 views
1

我正在研究概念验证项目。这是使用UITableView来显示一些实时数据。 “实时数据”正在与应用程序中的实时传感器信息进行合并。带有实时数据的UITableView也具有用户交互同时

在用一些NSMutableArray数据呈现UITableView后,NSMutableArray每1秒更新一次传感器数据appprox,同时UITableView也有用户交互。

我的问题是,根据上述,什么是最好的方法消耗UITableView的实时数据?

任何建议,样本将不胜感激。

+0

苏兹的答案应该适合你。 –

+0

是的,我明白了。谢谢糖。 – fyasar

回答

2

在苹果文档中的SeismicXML parser sample code做了类似的事情。它从服务器获取有关地震的“生活”(即更改)信息,并在新信息到达时通过NSNotification更新数据源。 UITableView根据NSMutableArray更改时的键值观察重新加载其数据。重载是用[tableView reloadData]完成的。

还有用户与表格的交互:用户可以选择一个tableViewCell并选择按照链接进一步的信息。

如果您担心控制协调:您想要避免的是用户点击表格,dataArray被更改,并且-tableView:didSelectRowAtIndexPath:方法尝试同时访问数据。有两种选择:在数据更新期间阻止表中的选择,或在行选择发生时阻止数据更新。

您可以通过设置tableView.allowsSelection=NO来阻止与表格的交互。通过使用键值观察选项:NSKeyValueObservingOptionPrior可以找出数据何时要更新。这种方法通常会失去点,因为你可能会打断用户想要做的事情。

另一种选择是通过设置几个布尔值来延迟数据更新:isSelecting和dataNeedsReloading。流将是这样的: 用户轻敲桌子,isSelecting=YES 如果新的数据进来,

if (isSelecting) { 
    [tempArray addObject:newData]; 
    dataNeedsReloading=YES; 
} 

然后在选择过程完成后,重新isSelecting=NO,检查dataNeedsReloading标志,结合阵列和重新加载表如果需要的话。完成后,重置dataNeedsReloading=NO。还用-removeAllObjects重置tempArray。

+0

谢谢你的回答,那么数据呢?我的意思是我有单个NSMutableArray来保存数据?如果我尝试同步数据,用户也会在同一时间在屏幕上进行操作。该应用可能会崩溃。看来我需要一些锁定机制来防止并发访问单个回购对象。 – fyasar

+0

UITableViews有一个BOOL属性'allowedSelection'。您可以在调用[tableView reloadData]之前将其设置为“NO”。然后将其重新设置为“是”。这会在重新加载时关闭与桌面的交互。 – Suz

+0

哦,我从来不知道,谢谢你的信息Suz – fyasar

0

如果要在每次数据源更改时更新UITableView,请发送一条reload消息。

+0

tob,谢谢你的回应。请看我写给苏兹答案的评论。 – fyasar

0

无论何时可以从传感器获得新数据,在主线程上调用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; 
} 
相关问题