如何在委托中的线程内构建我的单元格?

时间:2013-06-10 11:32:11

标签: ios objective-c multithreading cocoa-touch

我有这个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?在进入线程之前?

1 个答案:

答案 0 :(得分:1)

  

因为一些紧张的帧速率正在影响表的响应性,所以我想将所有这些单元格的创建传递给一个线程。

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

  

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

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

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

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