2015-04-03 8 views
5

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 *)indexPathGrund 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.

Antwort

2

Es wird nur Speicher gespart, wenn Sie mehrere Instanzen Ihrer Tabelle/Sammlungsansicht haben, da sie alle die gleiche Instanz wiederverwenden. Dies ist effizienter, obwohl es wahrscheinlich nicht oft verwendet wird. Durch die Verwendung der Statik bleibt auch der gesamte Code an einem Ort.

Sie können es sicherlich tun, wie Sie vorschlagen, und die Vorteile des Versands sind nicht riesig, aber ich würde den Versand einmal Route wählen (obwohl Sie Dispatch einmal in Ihrem Modell verwenden könnten, um th Lazy Load zu erreichen).

4

Das Verhalten von dispatch_once ist im Namen. Es macht etwas einmal und nur einmal.

Der Vorteil von dispatch_once() über den anderen Ansatz ist, dass es schneller ist. Es ist auch semantisch sauberer, weil die gesamte Idee von dispatch_once() "etwas einmal und nur einmal ausführen" ist, was genau wir tun.

Es ist eine Low-Level-GCD-API, die Leistungsverbesserungen gegenüber jedem anderen Ansatz bietet.

+0

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. –

0

Wie viele Codezeilen haben Sie verwendet? In wie vielen verschiedenen Orten? Hast du viele Zeilen Code, wenn du es threadsicher machen wolltest, was hast du nicht gemacht?

dispatch_once ist ein bekanntes Muster, das jeder versteht. Der Code ist genau an der Stelle, wo er hingehört. Es funktioniert, und es ist bekannt, dass es funktioniert. Dies ist keine Frage des Stils, sondern eine Frage der Verwendung eines bekannten und überlegenen Musters anstelle einer zufälligen, unsicheren und schwer zu pflegenden Methode.

+0

Ich stimme diesem Versandmuster zu, behalte den Code wo er hingehört. Aber zweifeln Sie immer noch daran, wie faul Last Eigentum ist planlos, unsicher und schwer zu pflegen? – sarunw