首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用线程更新UITableView

使用线程更新UITableView
EN

Stack Overflow用户
提问于 2010-07-31 04:05:26
回答 4查看 5.7K关注 0票数 5

我正在为iPhone创建一个字典应用程序,它在用户键入时给出结果。我使用线程(NSThread)来更新UITableView,这样主线程就不会被阻塞。

但是,当UITableView向数据源询问行数时( tableView:numberOfRowsInSection:),我返回,比如说,10。然后它向数据源询问单元格0-9 (tableView:cellForRowAtIndexPath:)。但是,当它请求单元格7时,数据源已经更改,现在只有5行,因此导致崩溃。

下面是我解决这个问题的方法:

我在init方法中创建了一个NSLock。

下面是数据源的外观:

代码语言:javascript
运行
复制
- (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;
}

下面是我用来更新表的代码:

代码语言:javascript
运行
复制
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

它完全解决了崩溃问题。但是,我认为它可能效率不高,因为每次请求单元格时,数据源都必须锁定/解锁。我上面提到的情况并不经常发生。有没有人有更好的办法有效地解决这个问题?

非常感谢!

EN

回答 4

Stack Overflow用户

发布于 2010-07-31 04:34:05

不要试图从后台线程更新UI。这是行不通的。

票数 4
EN

Stack Overflow用户

发布于 2010-07-31 04:11:59

为什么你要使用一个单独的线程呢?搜索需要多长时间? 0.1秒?与用户停止输入并看着屏幕所花费的时间相比,情况如何?

不要把事情过于复杂化!(如果您的搜索时间超过0.7秒,并且无法优化,我将收回这一点;-)

票数 2
EN

Stack Overflow用户

发布于 2011-04-16 14:08:02

所以这里有一个有用的答案,这是我对另一个类似问题的答案。

在不了解你的应用程序的情况下,我认为更好的解决方案之一是将数组保留在主线程上,并在其他线程需要进行更改时将其分派回主线程。如下所示:

代码语言:javascript
运行
复制
dispatch_async(dispatch_get_main_queue(), ^{
                [array addObject:object];
                [tableView reloadData];
            });

当然,使用分派API可能会变得复杂得多,但它确实可以为您处理锁定和所有事情。这绝对比使用NSLock更优雅。不过,它只适用于iOS 4或更高版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3374979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档