我正在研究概念证明项目。那就是使用UITableView来显示一些实时数据。 “实时数据”正在与应用程序中的实时传感器信息合并。
使用一些NSMutableArray数据渲染UITableView后,NSMutableArray每1秒更新一次传感器数据appprox,UITableView也会同时进行用户交互。
根据上面的说法,我的问题是什么是在UITableView上使用实时数据的最佳方法?
任何建议,样品将不胜感激。
答案 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;
}