Всем привет! Первый раз столкнулся с такой проблемой, опыта в разработке не много.
Получаю данные с сервера, отображаю в 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;
}