0

我有这个 tableView,我想以自定义方式构建单元格。我这样做的方法是向单元格添加子视图。

- (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];
    }
    else
    {
        UIImageView* img=[UIImage imageNamed:@"abc.png"];
        [cell addSubview:img];    

        //processing the final cell takes time!
    }
    return cell;
}

但是,由于一些抖动的帧速率会影响表格的响应能力,我想将所有这些单元格的创建传递到一个线程中。所以我想同时放置某种图像,一旦完成,线程将更新cell为最后一个单元格。

这是正常的做法吗?

如果是这样,我如何从线程更新单元格?

我需要将所有变量定义为 __block 吗?在进入线程之前?

4

1 回答 1

1

由于某些抖动的帧速率会影响表格的响应能力,因此我想将所有这些单元格的创建传递到一个线程中。

UITableViewCell包括在内的绝大多数 UIKit都不是线程安全的。来自 Apple 的文档:

在大多数情况下,UIKit 类应该只在应用程序的主线程中使用。对于从 UIResponder 派生的类或涉及以任何方式操作应用程序的用户界面的类尤其如此。

...只有少数绘图和图形上下文方法UIKit是线程安全的。在辅助线程上创建单元格是一个非常糟糕的主意。你不想这样做。

有很多材料可以有效地创建单元格并将其绘制到表格视图中 - 正如有人在评论中指出的那样,您似乎UIImageView不是在单元格创建时添加,而是在重用时添加。这意味着您的单元格将不断添加许多图像视图。这显然不是一个好主意。

一个更好的想法是创建一个UITableViewCell已经包含您需要的视图的子类,或者在创建时添加它们并通过视图标签访问它们。

于 2013-06-10T11:51:51.197 回答