Catégorie pour la size d'un UIViewController
Bonsoir !
Je reviens sur une question déjà posée : déterminer la taille d'une vue qui "vit" dans un xib. Comme j'en avais marre de toujours écrire le même code, j'ai fait une petite catégorie.
Je voulais avoir vos avis sur comment l'améliorer. En particulier, est-ce possible de protéger les accès concurrents ? Est-ce possible de n'exécuter le code qu'une seule fois par sous-classe de UIViewController (faire un dispatch_once dont le token serait possédé par la sous-classe, en quelque sorte) ?
Sinon, pensez-vous que ce code est dangereux ?
Merci !
#import "UIViewController+CBDSize.h"
static NSMutableDictionary * _dictionnaryForSizes ;
@implementation UIViewController (CBDSize)
+ (CGSize)size_cbd_
{
NSString * nameClass = NSStringFromClass([self class]) ;
if (!_dictionnaryForSizes[nameClass])
{
if (!_dictionnaryForSizes)
{
_dictionnaryForSizes = [NSMutableDictionary new] ;
}
/*
Loading the nib
*/
NSArray * objects = [[NSBundle mainBundle] loadNibNamed:nameClass
owner:[[self alloc] init]
options:0] ;
UIView * firstView = [objects firstObject] ;
_dictionnaryForSizes[nameClass] = [NSValue valueWithCGSize:firstView.frame.size] ;
}
NSValue * value = _dictionnaryForSizes[nameClass] ;
return [value CGSizeValue] ;
}
@end
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
2) Scope ta variable statique uniquement à l'intérieur de ta méthode, pour limiter les accès externes
3) Préfère NSCache à NSMutableDictionary pour ce genre d'usage
Merci Ali pour ton aide !
OK pour le 2).
Pour le 1), mon problème c'est qu'il faut que cette méthode ne soit appelée qu'une seule fois par classe. Exemple : MyVC et MyVCbis héritent tous les deux de UIViewController. Il faut que la size soit calculée une fois si j'appelle [MyVC size_cbd_] et une autre fois si j'appelle [MyVCbis size_cbd_] ;
Je ne sais pas trop comment faire.
Par exemple, après test, le code qui suit ne marche pas. [MyVC size_cbd_] donne la bonne valeur mais [MyVCbis size_cbd_] donne {0,0}
Merci !
Bref, pour initialiser l'instance de ta variable statique (que ce soit un NSMutableDictionary ou un NSCache). Pas pour la remplir.
Et du coup ton instance de NSCache ne sera créée qu'une fois mais ça n'empêche pas que ton NSCache, lui, sera interrogé à chaque fois, pour chaque classe et/ou sous-classe.
OK, c'est plus logique, oui.
Pourquoi me conseilles-tu NSCache plutôt que NSDictionary ?
Merci !
Certes pour ton cas particulier, tu ne stockes que des @(CGSize) donc c'est pas ça qui va risquer de déclencher un memory warning, mais bon, sur le principe c'est une bonne pratique d'utiliser les classes qui sont dédiées à un usage particulier quand tu as besoin de cet usage
http://nshipster.com/nscache/