Domanda

Ho una domanda su sovrascrivendo i metodi di accesso generate automaticamente. Quanto segue non avrebbe funzionato (credo) perché ogni riferimenti getter l'altro getter. C'è una regola che metodi di accesso non dovrebbero usare altri metodi di accesso, o avete semplicemente guardare fuori per queste situazioni singolarmente?

-(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;
}

Devo sottolineare che l'utilizzo dell'immagine presentata qui è un esempio, e pensieri riguardanti cosa fare in questo particolare esempio sono meno importanti nel caso generale.

È stato utile?

Soluzione

In primo luogo, non essere troppo intelligente per il tuo bene. Se si desidera ottenere su qualche collo di bottiglia, prima misura e assicurarsi che sia davvero lì. Credo che sia UIImage e NSData fare un po 'lazy loading interno, in modo che il codice potrebbe essere sostanzialmente inutile. In secondo luogo, anche se si voleva davvero fare qualcosa di simile a mano, provare a dividere il codice di caching in una classe separata, in modo che non inquinano il codice della classe principale.

Non c'è una regola su metodi di accesso (almeno nessuno che io sappia), perché le persone non fanno molto lazy loading in funzioni di accesso. A volte ho io presi da un ciclo infinito causato da [UIViewController loadView] pigro in combinazione con [UIViewController view], ma che su di esso.

Altri suggerimenti

Non c'è niente che lo proibisce, ma tu sei sicuramente scrivere del codice confusione. Essenzialmente, queste due proprietà hanno una dipendenza circolare. Questo è difficile da entrambi lettura e di debug. Non è chiaro il motivo per cui ci si vuole "caricare i dati" prima di "caricare l'immagine", o perché ci si vuole anche sostenere "caricare l'immagine" prima di "caricare i dati", o realmente come le due proprietà sono davvero due cose diverse.

quello che si sta effettivamente facendo in questo esempio potrebbe richiedere molto tempo per il carico; è meglio assicurarsi che sia thread-safe.

Inoltre, sarebbe ancora meglio se fatto i dati oggetto un fornitore di dati reali (tipicamente utilizzando protocolli), separare dalla classe, e per rendere il contenitore immagine esporre che sta gestendo un oggetto pigramente caricato (che può causare clamore da alcune persone).

In particolare, si consiglia di richiamare un dato carico / immagine dal provider, chiamare da awakeFromNib (per esempio) - (. Specialmente se scaricato), quindi il caricatore scappa e carica i dati su un thread secondario. dare il fornitore di dati di un callback per informare l'opinione che l'immagine è pronta (in genere utilizzando i protocolli). una volta che la vista prende l'immagine non archiviata, invalidare il provider di dati.

Infine, se hai a che fare con le risorse app, il 'sistema' nella cache alcuni di questo per voi sooo che ci si stia tentando di lavoro contro ciò che è già ottimizzato dietro le quinte.

in breve, di solito è ok (inizializzazione esempio non pigro) -., Ma questo motivo specifico (come detto altro poster) presenta una dipendenza circolare che dovrebbe essere minimizzato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top