UITableView с живыми данными также взаимодействует с пользователем одновременно - PullRequest
1 голос
/ 02 октября 2011

Я работаю над проверкой концепции проекта.Это использует UITableView для отображения некоторых живых данных."живые данные" объединяются с информацией о датчиках в реальном времени в приложении.

После того, как UITableView визуализируется с некоторыми данными NSMutableArray, этот NSMutableArray обновляется с appprox данных датчика каждую 1 секунду, также UITableView взаимодействует с пользователем в то же время.

Мой вопрос, согласно вышеизложенному, чтолучший подход потреблять живые данные на UITableView?

Любые предложения, образцы будут оценены.

Ответы [ 3 ]

2 голосов
/ 02 октября 2011

Пример кода парсера SeismicXML в документации Apple делает нечто подобное.Он получает «живую» (то есть изменяющуюся) информацию о землетрясениях с сервера и обновляет источник данных через NSNotification при поступлении новой информации.UITableView перезагружает свои данные на основе наблюдения значения ключа, когда NSMutableArray изменяется.Перезагрузка выполняется с помощью [tableView reloadData].

Существует также взаимодействие пользователя с таблицей: пользователь может выбрать tableViewCell и перейти по ссылке для получения дополнительной информации.

Если вы 'Вы беспокоитесь об управлении координацией: вы хотите избежать того, что пользователь нажимает на таблицу, dataArray изменяется, и метод -tableView:didSelectRowAtIndexPath: пытается получить доступ к данным одновременно.Есть два варианта: либо запретить выбор в таблице при обновлении данных, либо запретить обновление данных во время выбора строки.

Вы можете предотвратить взаимодействие с таблицей, установив tableView.allowsSelection=NO.Вы можете узнать, когда данные будут обновлены, используя опцию наблюдения значения ключа: NSKeyValueObservingOptionPrior.Этот подход обычно теряет очки, потому что вы можете прерывать то, что хотел сделать пользователь.

Другой вариант - отложить обновление данных, установив пару логических значений: isSelecting и dataNeedsReloading.Поток будет выглядеть примерно так: пользователь нажимает на таблицу, isSelecting=YES Если поступают новые данные,

if (isSelecting) {
    [tempArray addObject:newData];  
    dataNeedsReloading=YES;
}

Затем, когда процесс выбора завершается, сбрасывают isSelecting=NO, проверяют флаг dataNeedsReloading, объединяютмассивы и перезагрузите таблицу, если это необходимо.Когда закончите, сбросьте dataNeedsReloading=NO.Также сбросьте tempArray с помощью -removeAllObjects.

0 голосов
/ 26 сентября 2012

Вызывать метод 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;
}
0 голосов
/ 02 октября 2011

Если вы хотите обновлять UITableView при каждом изменении источника данных, отправьте ему сообщение reload.

...