heightForImageCellAtIndexPath中dispatch_once的原因

时间:2015-04-03 08:37:40

标签: ios objective-c uitableview autolayout autosize

当我搜索如何在iOS中实现自动调整大小时,我在- (CGFloat)heightForImageCellAtIndexPath:(NSIndexPath *)indexPath here herehere) p>

static CommentedItemCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
});

但我无法找到这个dispatch_once背后的原因。我认为它的目的是节省一些记忆,但为什么这种风格。为什么不定义属性和延迟加载它。

@property (nonatomic, strong) UITableViewCell sizingCell;

- (UITableViewCell)getSizingCell
{
  if (_sizingCell) return _sizingCell;

  _sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];

  return _sizingCell;
}

想知道它的编码风格,或者这个dispatch_once实现背后有一些好处。

3 个答案:

答案 0 :(得分:4)

dispatch_once的行为在名称中。它只执行一次。

dispatch_once()优于其他方法的好处是它更快。它在语义上也更清晰,因为dispatch_once()的整个想法是“只执行一次”,这正是我们正在做的事情。

这是一个低级别的GCD API,与其他方法相比,性能得到了提升。

答案 1 :(得分:2)

如果您有多个表/集合视图实例,它将只保存内存,因为它们都将重用相同的实例。虽然可能不经常使用,但效率更高。使用静态还可以将所有代码保存在一个位置。

你当然可以按照你提出的方式做到这一点,而且一次调度的好处并不大,但我会选择一次路由调度(尽管你可以在你的模型中使用一次调度来实现延迟加载)

答案 2 :(得分:0)

您使用了多少行代码?在多少个不同的地方?如果你想让它的线程安全,那么你有很多行代码,你没有这样做?

dispatch_once是众所周知的众所周知的模式。代码完全在它所属的位置。它的工作原理,众所周知。这不是一个风格问题,这是一个使用众所周知的优越模式而不是随意,不安全和难以维护的方法的问题。