Обновите UITableView с помощью потоков

Я создаю приложение словаря для 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];

Это решает проблему катастрофического отказа полностью. Однако я думаю, что это не могло бы быть эффективно, потому что источник данных должен блокировать/разблокировать каждый раз, когда это просят относительно ячейки. И случая, который я упомянул выше, не происходит настолько часто. У кого-либо есть лучшая идея того, как решить эту проблему эффективно?

Большое спасибо!

5
задан ifvc 30 July 2010 в 20:05
поделиться