Почему не корректно обновляются данные в collection view?

Всем привет! Первый раз столкнулся с такой проблемой, опыта в разработке не много.
Получаю данные с сервера, отображаю в collection view. Все хорошо, отображается как нужно.
Начинаю получать данные с websockets, делаю reloadData для collection view и у меня не правильно присваиваются данные.
Есть 3 комнаты. Первая комната содержит устройства, вторая и третья - пустые. Приходят данные температуры и влажности. Вот начальное отображение, в первой комнате нулевые значения, в двух остальных дефолтные.
По websockets приходят данные "id устройства":"value". Делаю reloadData collection view и вот такая беда. Третьей комнате присваиваются значения из первой.
Подскажите, пожалуйста, как решить эту проблему?
Тут обрабатываются полученные данные. (да, сокеты сам "дергаю")
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
{
    //NSLog(@"The websocket received a message: %@", message);
    
    NSString *data = [message stringByReplacingOccurrencesOfString:@"GET" withString:@""];
    NSLog(@"%@", data);
    
    if ([data containsString:@"val"])
    {
        self.websocketsModel = [WebsocketsModel arrayOfModelsFromString:data error:nil];
        [self.collectionView reloadData];
    }
    
    // интервал на запрос данных 30 сек
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(30 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.webSocket send:@"GET"];
    });
}

Далее метод collection view. Немного хардкода, но я еще учусь :)
([_rooms objectAtIndex:indexPath.item - 1] - из-за дополнительной ячейки для электричества)
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *idElectricityCell = @"electricityCell";
    static NSString *idRoomCell = @"roomCell";
    
    
    if (indexPath.item)
    {
        DashboardCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:idRoomCell forIndexPath:indexPath];
    
        cell.nameRoomLabel.text = [[_rooms objectAtIndex:indexPath.item - 1] title];
        
        for (DevicesModel *device in [[_rooms objectAtIndex:indexPath.item - 1] devices])
        {
            // если девайс "температура"
            if ([[device valueForKeyPath:@"deviceTypeId"] isEqual:@8])
            {
                NSString *valueByTemperatureLabel = nil;
                
                // если модель сокетов не пустая
                if (self.websocketsModel)
                {
                    for (WebsocketsModel *obj in self.websocketsModel)
                        if ([obj.idDevice isEqualToString:@"48"])
                            valueByTemperatureLabel = obj.value;
                    
                    cell.temperatureLabel.text = valueByTemperatureLabel;
                }
                
                else
                    cell.temperatureLabel.text = [NSString stringWithFormat:@"%@", [device valueForKeyPath:@"value"]];
            }
            
            // если девайс "влажность"
            if ([[device valueForKeyPath:@"deviceTypeId"] isEqual:@9])
            {
                NSString *valueByTemperatureLabel = nil;
                
                // если модель сокетов не пустая
                if (self.websocketsModel)
                {
                    for (WebsocketsModel *obj in self.websocketsModel)
                        if ([obj.idDevice isEqualToString:@"49"])
                            valueByTemperatureLabel = obj.value;
                    
                    cell.humidityLabel.text = valueByTemperatureLabel;
                }
                else
                    cell.humidityLabel.text = [NSString stringWithFormat:@"%@", [device valueForKeyPath:@"value"]];
            }
        }
        return cell;
    }
    
    else
    {
        DashboardEletricityCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:idElectricityCell forIndexPath:indexPath];
        
        cell.electricity.text = [NSString stringWithFormat:@"%@", _powerAnalitic.wattsNow];
        cell.costElectricityPerDay.text = [NSString stringWithFormat:@"%@", _powerAnalitic.cost];
        
        return cell;
    }
    
    return nil;
}
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
f0r3s1
@f0r3s1
iOS Developer
Ну тебе стоит проверить парс в didReceiveMessage, по брейкпоинтам, доходит ли он вообще до CollectionView, далее проверить что происходит внутри делегата заполнения ячейки, посмотри внимательно warning'и все, возможно где-то проблема приведения типов. В вопросе очень важно описать не код, а где и что теряется/какой фрагмент не работает или не правильно работает, сужай вопрос и больше debug инфы
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы