Ios IMAGECELLATINDEXPATH在高度上调度_一次的原因
当我搜索如何在iOS中实现自动调整单元格大小时,我在Ios IMAGECELLATINDEXPATH在高度上调度_一次的原因,ios,objective-c,uitableview,autolayout,autosize,Ios,Objective C,Uitableview,Autolayout,Autosize,当我搜索如何在iOS中实现自动调整单元格大小时,我在-(CGFloat)heightForImageCellAtIndexPath:(NSIndexPath*)indexPath中遇到了许多例子(和)这些神秘的代码 static CommentedItemCell *sizingCell = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sizingCell = [self.tableVie
-(CGFloat)heightForImageCellAtIndexPath:(NSIndexPath*)indexPath中遇到了许多例子(和)这些神秘的代码
static CommentedItemCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
});
但我找不到这件事背后的原因。我认为它的目的是保存一些记忆,但为什么是这种风格。为什么不定义属性并延迟加载它呢
@property(非原子,强)UITableViewCell sizingCell代码>
与
想知道它只是一种编码风格,或者说这种dispatch_once实现背后有一些好处。只有当您的表/集合视图有多个实例时,它才会节省内存,因为它们都会重用同一个实例。这是更有效的,虽然可能不经常使用。使用static还可以将所有代码保存在一个地方
你当然可以按照你建议的方式来做,一次分派的好处并不多,但我会选择一次分派路线(尽管你可以在模型中使用一次分派来实现延迟负载)。一次分派的行为是名副其实的。它只做一次
与其他方法相比,dispatch\u once()
的优点是速度更快。它在语义上也更清晰,因为dispatch\u once()
的整个思想是“只执行一次”,这正是我们正在做的
这是一个低级的GCD API,与其他方法相比,它提供了性能改进。您使用了多少行代码?在多少不同的地方?如果你想让它线程安全,你需要很多行代码,但你没有
dispatch_once是众所周知的模式,每个人都能理解。代码就在它所属的地方。它是有效的,而且众所周知它是有效的。这不是一个风格的问题,这是一个使用众所周知的、优越的模式而不是随意、不安全、难以维护的方法的问题 此外,我们生活在一个多线程的世界中,dispatch_once是线程安全的。可以保证,来自多个线程的多个同时调用dispatch_once只会执行一次块,所有线程都会等到执行完成后,dispatch_once才会返回。即使你自己也不难做到,但dispatch_once也非常快,而且很难做到。我同意这种分派模式,将代码保留在它所属的位置。但仍然怀疑惰性负载属性是多么随意、不安全和难以维护?
- (UITableViewCell)getSizingCell
{
if (_sizingCell) return _sizingCell;
_sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
return _sizingCell;
}