从多个线程更新UITableViewCell中的标签

时间:2014-08-18 15:09:47

标签: ios uitableview

从多个设备获取数据后,我正在重新加载tableview,但tableview正在闪烁标签。例如,tableview中的两行每个包含两个标签。当我调用reload tableview时,在第一行和第二行显示数据将为空,当显示第二行时,第一行将为空。就像它闪烁,请帮助我如何解决这个问题

像这样我正在重新加载tableview

[devicesTableView performSelectorOnMainThread:@selector(reloadData)
                                   withObject:nil
                                waitUntilDone:NO];

这是CellForAtIndexPath方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

   static NSString *simpleTableIdentifier = @"DeviceCustomTableViewCellIdentifier";

    devicesCustomTableViewCell = (DeviceCustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (devicesCustomTableViewCell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DeviceCustomTableViewCell" owner:self options:nil];
        devicesCustomTableViewCell = [nib objectAtIndex:0];
    }

    DeviceDetails *deviceDetailsEntity = [devicesArray objectAtIndex:indexPath.row];

    devicesCustomTableViewCell.deviceName.text = deviceDetailsEntity.deviceLocalName;

    for (int i=0; i<[dataArray count]; i++) {
        DeviceParticulars *deviceParticulars = [dataArray objectAtIndex:i];
        if ([[[deviceParticulars.peripheral identifier] UUIDString] isEqualToString:deviceDetailsEntity.deviceAddress]) {

            devicesCustomTableViewCell.temperatureValueLabel.text = deviceParticulars.tempReadOutStr;



   }

在此, DeviceDetails 类是核心数据类,因为我按照要求保存了BLE设备名称。

DeviceParticulars 类是NSObject类,用于保存来自多个BLE设备的数据,例如我从多个设备获取温度。我在tableview中显示Temp值。

dataArray 是一个包含 DeviceParticulars 对象的数组。

2 个答案:

答案 0 :(得分:1)

尝试使用适用于iOS 6及更高版本的-dequeueReusableCellWithIdentifier:forIndexPath:方法。如果没有可重复使用的单元格,它将自动实例化单元格,因此您不必检查单元格== nil。不确定是什么原因造成你的问题,但我认为值得尝试。 如果有帮助,请告诉我。

答案 1 :(得分:1)

每次外围价值变化时重新加载整个表格都很昂贵,正如您所看到的那样,会产生视觉影响。

您可以更改自定义单元格以充当模型对象的委托 - DeviceParticulars

在DeviceParticulars.h文件中,注册委托属性和协议

@property (weak,nonatomic) id delegate;

@protocol DeviceParticularsDelegate
- (void)didUpdateDevice:(DeviceParticulars *)device;
@end

在您更新读数的DeviceParticulars.m文件中,请致电

[self.delegate didUpdateDevice:self];

然后在您的DeviceCustomTableViewCell.h中,将<DeviceParticularsDelegate>添加到类定义并添加一个属性来存储您的deviceParticulars

@property (strong,nonatomic) DeviceParticulars *myDevice;

在.m中实现委托方法

-(void)didUpdateDevice:(DeviceParticulars *)device {
   // Update cell labels as required
}

并实施prepareForReuse

- (void)prepareForReuse {
    self.myDevice.delegate=nil;  // Remove this cell as delegate for existing device;
}

最后,在cellForRowAtIndexPath

中设置代理
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

   static NSString *simpleTableIdentifier = @"DeviceCustomTableViewCellIdentifier";

    devicesCustomTableViewCell = (DeviceCustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (devicesCustomTableViewCell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DeviceCustomTableViewCell" owner:self options:nil];
        devicesCustomTableViewCell = [nib objectAtIndex:0];
    }

    DeviceDetails *deviceDetailsEntity = [devicesArray objectAtIndex:indexPath.row];

    devicesCustomTableViewCell.deviceName.text = deviceDetailsEntity.deviceLocalName;

    for (int i=0; i<[dataArray count]; i++) {
        DeviceParticulars *deviceParticulars = [dataArray objectAtIndex:i];
        if ([[[deviceParticulars.peripheral identifier] UUIDString] isEqualToString:deviceDetailsEntity.deviceAddress]) {

            deviceParticulars.delegate=deviceCustomTableViewCell;   //Set the delegate
            devicesCustomTableViewCell.myDevice=deviceDetails;      //Set device property

            devicesCustomTableViewCell.temperatureValueLabel.text = deviceParticulars.tempReadOutStr;


   }