2017-04-16 2 views
2

J'ai une application qui utilise l'emplacement de l'utilisateur à travers ses différents afficheurs, et j'ai appris que pour obtenir cet emplacement, vous devez créer une instance de CLLocationManger et être conforme au protocole CLLocationManagerDelegate.Où devrais-je instancier un gestionnaire de localisation si mon application l'utilise dans ses différents contrôleurs de vue?

Est-il possible de créer une instance de CLLocationManager et d'utiliser ses propriétés comme des coordonnées dans mes différents contrôleurs de vue ou dois-je créer un CLLocationManager dans chaque classe de contrôleur de vue?

+0

Serait-il possible de créer simplement dans une sorte de fichier de constantes? –

+0

Qu'avez-vous déjà essayé? Oui, il est possible et recommandé d'utiliser une seule instance d'un CLLocationManager. Le délégué peut être un objet partagé par lequel d'autres clients peuvent faire KVO sur ses propriétés ou il peut envoyer NSNotifications (moins idéal) – dbn

+0

@dbn Je pensais à l'instancier dans la fonction didloadwithoptions du délégué de l'application et essayé de référencer l'instance à partir d'autres contrôleurs de vue ça n'a pas marché. donc je suis venu ici à la recherche de réponses. J'ai juste besoin de la latitude et de la longitude à utiliser dans d'autres contrôleurs de vue. –

Répondre

1

Un hack rapide et peu robuste pourrait être:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate { 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.startUpdatingLocation() 
     return true 
    } 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     lastLocation = locations.last! 
    } 

Dans ce même fichier source, à portée globale, ajouter:

private var lastLocation: CLLocation? { 
    didSet { 
     locationCallback?(lastLocation!) 
     locationCallback = nil 
    } 
} 

private var locationCallback: ((CLLocation) -> Void)? 

func getLastLocation(callback: (CLLocationManager) -> Void) { 
    guard let location = lastLocation else { 
     locationCallback = callback 
     return 
    } 
    locationCallback(location) 
} 

Enfin, ailleurs dans votre application, vous pouvez obtenir votre dernière emplacement connu en utilisant seulement:

getLastLocation { location in 
    print(location) 
} 
+0

Merci beaucoup! serait-ce mieux que de créer une classe singleton/statique et de faire un peu la même chose là-bas? –

+0

@PaulJohn Je dirais oui, quelque chose comme singleton! MAIS si votre application devient énorme, avec toutes sortes de fonctionnalités basées sur l'emplacement, alors refactoriser ce code à une classe dédiée est la voie à suivre ;-) –