带有实时数据的UITableView也可以同时进行用户交互

时间:2011-10-02 08:54:40

标签: iphone ios cocoa-touch uitableview ios-4.2

我正在研究概念证明项目。那就是使用UITableView来显示一些实时数据。 “实时数据”正在与应用程序中的实时传感器信息合并。

使用一些NSMutableArray数据渲染UITableView后,NSMutableArray每1秒更新一次传感器数据appprox,UITableView也会同时进行用户交互。

根据上面的说法,我的问题是什么是在UITableView上使用实时数据的最佳方法?

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

3 个答案:

答案 0 :(得分:2)

Apple文档中的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。

答案 1 :(得分:0)

如果您想在每次数据源更改时更新UITableView,请向其发送reload消息。

答案 2 :(得分:0)

只要Sensor提供了新数据,就可以在主线程上调用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;
}