Я создаю приложение словаря для iPhone, который дает результат, в то время как пользователи вводят. Я использую потоки (NSThread) для обновления UITableView так, чтобы основной поток не был заблокирован.
Однако катастрофический отказ происходит, когда UITableView просит у источника данных количество строк (tableView:numberOfRowsInSection:) и я возвращаюсь, скажем, 10. Затем это просит у источника данных ячейки 0-9 (tableView:cellForRowAtIndexPath:). Но к тому времени, когда это просит ячейку 7, источник данных уже изменился, и это теперь имеет только 5 строк, таким образом вызывая катастрофический отказ.
Вот то, как я решаю проблему:
Я создаю NSLock в init методе.
И вот то, на что похож источник данных:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [results count];
}
- (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];
}
[lock lock];
if (indexPath.row < [results count]) {
cell.textLabel.text = [results objectAtIndex:indexPath.row];
}
[lock unlock];
return cell;
}
И вот код, который я использую для обновления таблицы:
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
Это решает проблему катастрофического отказа полностью. Однако я думаю, что это не могло бы быть эффективно, потому что источник данных должен блокировать/разблокировать каждый раз, когда это просят относительно ячейки. И случая, который я упомянул выше, не происходит настолько часто. У кого-либо есть лучшая идея того, как решить эту проблему эффективно?
Большое спасибо!