2009-12-07 7 views
7

J'ai une application avec une barre d'onglets et 3 onglets. L'emplacement actuel de l'utilisateur va être nécessaire pour être connu sur l'un des trois onglets. Le meilleur endroit pour implémenter CLLocationManager serait-il dans le délégué de l'application dans ce cas?Où implémenter CLLocationManager

Est-ce correct (bonne pratique?) De placer les méthodes de délégation CLLocationManager dans le fichier m de délégué de l'application?

Où pourriez-vous suggérer que je place le CLLocationManager que je vais appeler -startUpdatingLocation de l'un des trois onglets?

Merci

Répondre

5

Le délégué de l'application est un endroit raisonnable pour le mettre. Une autre option consiste à créer une classe de fabrique personnalisée Singleton qui a une méthode de classe qui renvoie votre délégué de gestionnaire d'emplacement et implémente les méthodes de délégué là. Cela garderait votre classe de délégué de l'application plus propre.

Voici une implémentation de classe squelette singleton basée sur "Singletons in Cocoa: Doing them wrong" de Peter Hosey. Cela peut être exagéré, mais c'est un début. Ajoutez vos méthodes de délégué à la fin.

static MyCLLocationManagerDelegate *sharedInstance = nil; 

+ (void)initialize { 
    if (sharedInstance == nil) 
     sharedInstance = [[self alloc] init]; 
} 

+ (id)sharedMyCLLocationManagerDelegate { 
    //Already set by +initialize. 
    return sharedInstance; 
} 

+ (id)allocWithZone:(NSZone*)zone { 
    //Usually already set by +initialize. 
    @synchronized(self) { 
     if (sharedInstance) { 
      //The caller expects to receive a new object, so implicitly retain it 
      //to balance out the eventual release message. 
      return [sharedInstance retain]; 
     } else { 
      //When not already set, +initialize is our caller. 
      //It's creating the shared instance, let this go through. 
      return [super allocWithZone:zone]; 
     } 
    } 
} 

- (id)init { 
    //If sharedInstance is nil, +initialize is our caller, so initialze the instance. 
    //If it is not nil, simply return the instance without re-initializing it. 
    if (sharedInstance == nil) { 
     if ((self = [super init])) { 
      //Initialize the instance here. 
     } 
    } 
    return self; 
} 

- (id)copyWithZone:(NSZone*)zone { 
    return self; 
} 
- (id)retain { 
    return self; 
} 
- (unsigned)retainCount { 
    return UINT_MAX; // denotes an object that cannot be released 
} 
- (void)release { 
    // do nothing 
} 
- (id)autorelease { 
    return self; 
} 
#pragma mark - 
#pragma mark CLLLocationManagerDelegateMethods go here... 
+0

Comment puis-je aller sur la mise en œuvre d'une classe usine singleton? Cela semble être une bonne façon de procéder, mais je ne suis pas sûr à 100% par où commencer. – joec

+0

Voir l'exemple ci-dessus. –

+0

le formatage du code n'a pas fonctionné (désolé!) – joec

1

J'ai simplement inclus mon LocationManager dans mon AppDelegate directement, car il a ajouté peu de code.

Toutefois, si vous souhaitez inclure votre LocationManager dans AppDelegate, vous devez envisager d'utiliser NSNotifications pour avertir les contrôleurs de vue des mises à jour d'emplacement reçues par AppDelegate.

Voir ce lien Send and receive messages through NSNotificationCenter in Objective-C?

Questions connexes