【发布时间】:2010-07-30 20:05:26
【问题描述】:
我正在为 iPhone 创建一个字典应用程序,它会在用户键入时给出结果。我使用线程(NSThread)来更新UITableView,这样主线程就不会被阻塞了。
但是,当 UITableView 向数据源询问行数 (tableView:numberOfRowsInSection:) 并且我返回 10 时发生崩溃。然后它向数据源询问单元格 0-9 (tableView:cellForRowAtIndexPath: )。但是当它请求单元格 7 时,数据源已经发生了变化,现在它只有 5 行,从而导致崩溃。
这是我解决问题的方法:
我在 init 方法中创建了一个 NSLock。
这是数据源的样子:
- (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];
彻底解决了崩溃问题。但是,我认为它可能效率不高,因为数据源每次被要求提供单元格时都必须锁定/解锁。而我上面提到的情况并不经常发生。有谁知道如何有效地解决这个问题?
非常感谢!
【问题讨论】:
-
你不应该在另一个线程中更新 UI。
-
瑞克,我必须在另一个线程中搜索结果,因为搜索方法很慢,我不希望它阻塞主线程。您能否解释一下我如何在不使用其他线程的情况下实现这一目标?
-
让它更快。你到底在搜索什么?!
-
前缀搜索 200,000 条非唯一记录
-
按第一个字母索引它们可以节省 2log26 的二进制搜索步骤。将第二个字母也编入索引,平均可以让您浏览 300 条记录。必须在 0.1 秒内完成。
标签: iphone cocoa-touch multithreading uitableview