Frage

Ich habe eine Frage zu überschreiben automatisch generierten Accessormethoden. Die folgenden nicht funktionieren würde (glaube ich), weil jeder Getter verweist auf das andere Getter. Gibt es eine Regel, dass Accessormethoden keine andere Zugriffsmethoden verwenden soll, oder müssen Sie nur individuell für diese Situationen achten?

-(UIImage *) image{

    if(image == nil){
        if(self.data == nil){
            [self performSelectorInBackground: @selector(loadImage) withObject: nil]
        }else{
            self.image = [UIImage imageWithData: self.data];
        }
    }

    return image;
}

-(NSData *) data {

    if(data == nil){
        if(self.image == nil){
            [self performSelectorInBackground: @selector(loadData) withObject: nil]
        }else{
            self.data = UIImageJPEGRepresentation(self.image, 0.85);
        }
    }

    return data;
}

Ich muß betonen, dass das Bild der Verwendung angeboten hier ist ein Beispiel, und Gedanken über das, was in diesem Beispiel zu tun, sind weniger wichtig als im allgemeinen Fall.

War es hilfreich?

Lösung

Als erstes sei nicht zu klug für Ihre eigenen gut. Wenn Sie etwas Engpass, erste Maßnahme verwinden wollen und stellen Sie sicher, es ist wirklich da. Ich glaube, dass beide UIImage und NSData einig internen verzögertes Laden tun, damit Ihr Code könnte im Wesentlichen nutzlos. Zweitens: Selbst wenn Sie wirklich so etwas wie die von Hand machen wollten, Spaltung des Caching-Code in eine separate Klasse versuchen, so dass Sie den Code der Hauptklasse nicht verschmutzen.

Es gibt keine Regel über Accessoren (zumindest keine, die ich kenne), weil die Menschen faul Laden tun nicht viel in Accessoren. Manchmal habe ich mich von einer Endlos-Schleife, die durch faul [UIViewController loadView] in Kombination mit [UIViewController view] gefangen, aber das ist es.

Andere Tipps

Es gibt nichts, dass verbietet es, aber Sie sind auf jeden Fall einige verwirrend Code zu schreiben. Im wesentlichen weisen diese zwei Eigenschaften eine kreisförmige Abhängigkeit. Das ist schwer sowohl zu lesen und zu debuggen. Es ist nicht klar, warum Sie „lädt die Daten“ wollen würden, bevor Sie „um das Bild zu laden“, oder warum Sie auch Unterstützung wünschen würden „das Bild Laden“, bevor Sie „um die Daten zu laden“, oder wirklich, wie die beiden Eigenschaften sind wirklich zwei verschiedene Dinge.

, was Sie eigentlich in diesem Beispiel tun eine lange Zeit zu Last nehmen könnte; ist es am besten, um sicherzustellen, dass es Thread-sicher ist.

Darüber hinaus wäre es noch besser, wenn Sie die Daten einen realen Datenprovider-Objekt (in der Regel Protokolle) aus der Klasse trennen, und das Bild Behälter zu machen aussetzen, dass sie ein träge geladenes Objekt ist der Umgang mit (was dazu führen kann Aufschrei von einigen Leuten).

Insbesondere Sie können eine Belastungsdaten / Bild vom Anbieter aufzurufen, rufen Sie es aus awakeFromNib (zum Beispiel) - (bes. Wenn heruntergeladen) dann der Lader wegläuft und lädt die Daten auf einem sekundären Thread. gibt dem Datenprovider einen Rückruf, um die Ansicht zu informieren, dass das Bild fertig ist (in der Regel unter Verwendung von Protokollen). sobald die Ansicht, die die aus dem Archiv entfernt Bild nimmt, den Datenanbieter ungültig machen.

schließlich, wenn man es zu tun mit App-Ressourcen, die ‚System‘ werden einige dieser Cache für Sie sooo würden Sie an die Arbeit gegen versucht werden, was bereits hinter den Kulissen optimiert.

Kurz gesagt, es ist in der Regel in Ordnung (zum Beispiel nicht faul Initialisierung.) - aber das spezifische Design (als ein weiteres Plakat sagte) eine kreisförmige Abhängigkeit, die minimiert werden soll

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top