Я создаю словарное приложение для 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];
Полностью решает проблему сбоя. Тем не менее, я думаю, что это может быть неэффективно, потому что источник данных должен блокировать / разблокировать каждый раз, когда он запрашивается для ячейки. И случай, о котором я упоминал выше, случается не так часто. У кого-нибудь есть лучшее представление о том, как эффективно решить эту проблему?
Большое спасибо!