Question

J'ai une question sur le remplacement des méthodes accesseurs générées automatiquement. Ce qui suit ne fonctionnerait pas (je crois) parce que chaque référence getter l'autre getter. Y at-il une règle selon laquelle les méthodes accesseurs ne doivent pas utiliser d'autres méthodes d'accès, ou avez-vous juste faire attention à ces situations individuellement?

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

Je dois souligner que l'utilisation de l'image présentée ici est un exemple, et réflexions sur ce qu'il faut faire dans cet exemple particulier sont moins importants que dans le cas général.

Était-ce utile?

La solution

Tout d'abord, ne soyez pas trop intelligent pour votre propre bien. Si vous souhaitez obtenir sur un certain goulot d'étranglement, la première mesure et assurez-vous qu'il est vraiment là. Je crois que les deux UIImage et NSData faire un peu paresseux chargement interne, de sorte que votre code pourrait être essentiellement inutile. Deuxièmement, même si vous vouliez vraiment faire quelque chose comme ça à la main, essayez de diviser le code de mise en cache dans une classe séparée, de sorte que vous ne pollue pas le code de la classe principale.

Il n'y a pas de règle sur les accesseurs (au moins pas que je sache), parce que les gens ne font pas le chargement beaucoup plus paresseux accesseurs. Parfois, je me faire attraper par une boucle sans fin provoquée par [UIViewController loadView] paresseux en combinaison avec [UIViewController view], mais est à ce sujet.

Autres conseils

Il n'y a rien qui s'y oppose, mais vous écrivez certainement un code source de confusion. Pour l'essentiel, ces deux propriétés ont une dépendance circulaire. Il est difficile à la fois lire et à déboguer. Il est pas clair pourquoi vous voulez « charger les données » avant « charger l'image », ou pourquoi vous aussi voulez soutenir « charger l'image » avant de « charger les données », ou bien comment les deux propriétés sont vraiment deux choses différentes.

ce que vous faites réellement dans cet exemple pourrait prendre beaucoup de temps à la charge; il est préférable de vous assurer qu'il est thread-safe.

En outre, il serait encore mieux si vous avez fait l'objet de données un véritable fournisseur de données (généralement en utilisant des protocoles), séparé de la classe, et de rendre le récipient d'image exposer qu'il manipule un objet chargé paresseusement (ce qui peut provoquer tollé de la part des personnes).

Plus précisément, vous pouvez invoquer une charge de données / image du fournisseur, appelez de awakeFromNib (par exemple) - puis le chargeur ruisselle et charge les données sur (si elles sont téléchargées esp.) Un fil secondaire. donner au fournisseur de données un rappel pour informer l'opinion que l'image est prête (typiquement en utilisant des protocoles). une fois la vue prend l'image désarchivée, invalider le fournisseur de données.

Enfin, si vous avez affaire à des ressources d'applications, le « système » en cache une partie de ce pour vous que vous seriez sooo être essayer de travailler contre ce qui est déjà optimisé dans les coulisses.

En bref, il est généralement correct (par exemple pas paresseux initialisation) -. Mais cette conception spécifique (comme un autre dit) a une dépendance circulaire qui devrait être réduite au minimum

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top