Wenn ich für die Suche, wie Auto-Sizing Zelle in iOS implementieren stoße ich auf viele Beispiele (herehere und here) mit diesem mysteriösen Code in - (CGFloat)heightForImageCellAtIndexPath:(NSIndexPath *)indexPath
Grund für dispatch_once in heightForImageCellAtIndexPath
static CommentedItemCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
});
Aber ich kann nicht finden ein grund hinter dieser dispatch_once-sache. Ich denke sein Ziel, etwas Erinnerung zu speichern, aber warum dieser Stil. Warum nicht definieren Eigenschaft und faul laden Sie es.
@property (nonatomic, strong) UITableViewCell sizingCell;
mit
- (UITableViewCell)getSizingCell
{
if (_sizingCell) return _sizingCell;
_sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
return _sizingCell;
}
Wollen seine nur Codierstil wissen, oder es gibt einen gewissen Nutzen hinter dieser dispatch_once Umsetzung.
Wir leben auch in einer Multithread-Welt, und dispatch_once ist threadsicher. Es ist garantiert, dass mehrere gleichzeitige Aufrufe von dispatch_once aus mehreren Threads den Block nur einmal ausführen und alle Threads warten, bis die Ausführung abgeschlossen ist, bevor dispatch_once zurückkehrt. Selbst das ist nicht schwer zu erreichen, aber dispatch_once ist auch extrem schnell, und das ist wirklich schwierig. –