Я пишу приложение для чата iOS, в котором мне нужно показать список пользователей с панелью поиска. Через каждые 2 минуты я получаю обновленный список пользователей с сервера.Обновление UITableView в то время как UISearchBar активен
Проблема, с которой я столкнулся это
Дело: 1 Если у меня есть панель поиска активной и зову перезагрузки таблицы, когда DataSource обновляется, теперь, если я отменить поиск, я не получу оригинал Таблица. Отображаются только отфильтрованные результаты.
Корпус: 2 Если у меня есть активная панель поиска, и я просто обновляю источник данных и не перезаряжаю таблицу, теперь, если я отменил поиск, он будет циклически перемещаться по cellforrowatindexpath столько раз, сколько есть элементов в новом datasource, но он не отображает обновленные элементы. Infact, он перемещает элементы, потому что рассматривает новые пути индекса, но использует старые данные.
По перемешалось я имею в виду,
Скажем, если старый источник данных a1, a2, a3 и a4 с аватаров изображения a1, a2, a3, a4.
Новый источник данных a5, a1, a2, a3, a4 с изображениями a5, a1, a2, a3, a4.
Так перемешан вид, что я получаю a1 с a5 изображениями, a2 с a1 изображениями, а3 а4 изображений а4, без изображения.
4 клетки вместо 5.
Корпус: 3 (работает правильно) Если у меня есть панель поиска активной и я даже не обновлять источник данных, ничего не происходит, когда я отменить поиск (как и ожидалось). Мне нужно перезагрузить таблицу, чтобы получить обновленное представление.
Я хочу, чтобы он обновлял таблицу, даже если поиск активен, и когда я отменяю поиск, я должен получить обновленное представление таблицы. Я знаю, что это может быть достигнуто путем перезагрузки таблицы, когда нажата кнопка отмены, но я пытаюсь найти элегантное решение для этого.
Кроме того, пожалуйста, скажите мне концепцию (внутреннюю работу) за тем, почему это работает так.
Мой код:
- (void)refreshUserList
{
if(dtclass.updatedUserList && [resultsArray count] ==0)
{
userArray = dtclass.getUpdatedUserList;
[self.tableView reloadData];
[dtclass setUpdatedUserList:NO];
}
else if(dtclass.updatedUserList && [resultsArray count] !=0)
{
//Uncomment for Case:1
/*userArray = dtclass.getUpdatedUserList;
[dtclass setUpdatedUserList:NO];
[self.tableView reloadData];*/
//Uncomment for Case:2
/*userArray = dtclass.getUpdatedUserList;
[dtclass setUpdatedUserList:NO];*/
//remove else if code for Case:3
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section
{
if (resultsArray.count != 0)
{
return [resultsArray count];
}
return userArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView setSeparatorInset:UIEdgeInsetsMake(0, 70, 0, 0)];
GlobalListTableViewCell *cell = (GlobalListTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"GlobalListCell"];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"GlobalListTableViewCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
//custome class User
User *currentUser;
if(resultsArray.count !=0)
{
currentUser = [resultsArray objectAtIndex:indexPath.row];
}
else
{
currentUser = [userArray objectAtIndex:indexPath.row];
}
cell.nameLabel.text = currentUser.getName;
cell.timeLabel.text = @"5 pm";
dispatch_async(fetchImage, ^{
if([[currentUser getAvatarUrl] length]!=0)
{
[self loadImagesWithURL:[NSString stringWithFormat:@"%@%@",@"http:",[currentUser getAvatarUrl]] IndexPath:indexPath];
}
});
cell.avatarImage.image = [UIImage imageNamed:@"defaultUser.png"];
cell.messageLabel.text = @"No message";
return cell;
}
-(void) loadImagesWithURL:(NSString *)imageURL IndexPath:(NSIndexPath *)indexPath
{
NSURL *url = [NSURL URLWithString:imageURL];
NSData *data = [[NSData alloc ] initWithContentsOfURL:url];
UIImage *img = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
GlobalListTableViewCell *cell = (GlobalListTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
cell.avatarImage.image = img;
});
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath
{
return 60;
}
- (void)filterContentForSearchText:(NSString*)searchText scope: (NSString*)scope
{
resultsArray = [[NSArray alloc] init];
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.getName contains[c] %@", searchText];
resultsArray = [userArray filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope: [[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex: [self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
- (void)searchBarCancelButtonClicked:(UISearchBar *) aSearchBar {
aSearchBar.text = nil;
}
для перемешались данных, вы должны перезагрузить клетку после того, как вид асинхронного изображения загружает изображение. –
Также не учитывайте, что данные перезагрузки после изменения источника данных очень дорогостоящие ... Это не занимает много времени и производительности при условии, что вы используете надлежащий механизм dequeue –