我有这个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?在进入线程之前?
答案 0 :(得分:1)
因为一些紧张的帧速率正在影响表的响应性,所以我想将所有这些单元格的创建传递给一个线程。
绝大多数UIKit,包括UITableViewCell
,不是线程安全的。来自Apple的文档:
在大多数情况下,UIKit类只能从应用程序的主线程中使用。对于从UIResponder派生的类或者涉及以任何方式操纵应用程序的用户界面的类,尤其如此。
... UIKit
中只有少数绘图和图形上下文方法是线程安全的。在辅助线程上创建单元格是一个非常糟糕的主意。你不想这样做。
有很多材料可以有效地创建单元格并将单元格绘制到表格视图中 - 正如有人在评论中指出的那样,您似乎在添加UIImageView
而不是创建单元格,但是-使用。这意味着您的单元格将不断添加许多图像视图。这显然不是一个好主意。
更好的想法是创建一个已经包含您需要的视图的UITableViewCell
子类,或者在创建时添加它们并通过视图标记访问它们。