Alte Regionen monitoren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Alte Regionen monitoren

    Hallo Zusammen,

    habe mal eine Frage, ob Ihr so etwas auch schon gehabt habt oder wisst wie man das beheben kann.
    Ich benutze die Funktionen um einen Code auszuführen wenn der User eine Region betritt oder verlässt.

    Quellcode

    1. func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
    2. }
    3. func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
    4. }


    Ich habe ein CoreData Model um Orte mit Ihren Koordinaten zu sichern. Mit diesen Daten werden dann Annotations mit einem CLCiruularRegion erstellt, die sich dann auf die oben genannten Funktionen auswirken.


    Quellcode

    1. func OrteAnzeigen () {
    2. for Orte in ListeOrte {
    3. let coordinateAnnotation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(Orte.latitude, Orte.longitude)
    4. let annotation = MKPointAnnotation()
    5. let GeoCoordinate = CLLocation(latitude: Orte.latitude, longitude: Orte.longitude)
    6. let geofenceRegion = CLCircularRegion(center: coordinateAnnotation, radius: Orte.umkreis, identifier: Orte.name!)
    7. self.manager.stopMonitoring(for: geofenceRegion)
    8. self.manager.startMonitoring(for: geofenceRegion)
    9. CLGeocoder().reverseGeocodeLocation(GeoCoordinate) { (placemark, error) in
    10. if error != nil {
    11. print("Error keine GPS Daten")
    12. }
    13. else {
    14. if let place = placemark?[0] {
    15. if place.subThoroughfare != nil {
    16. annotation.title = Orte.name
    17. var adresse = place.name! + "\n"
    18. adresse += place.postalCode! + " "
    19. adresse += place.locality! + "\n"
    20. adresse += place.country! + "\n"
    21. annotation.subtitle = adresse
    22. }
    23. }
    24. }
    25. }
    26. annotation.coordinate = coordinateAnnotation
    27. }
    28. }
    Alles anzeigen
    Nun passiert es, das auch die gelöschten Regionen (die nicht mehr im CoreData Model sind) noch überprüft werden. Speichert die Map irgendwie die Regionen nochmal für sich? Wenn ja wie kann man diese auch in der Karte löschen? Es werden allerdings keine Regionen in der Karte angezeigt, allerdings reagieren die beiden Funktionen didEnterRegion oder didExitRegion auf die alten Regionen.

    Gruß Jörg
  • Korrigiert mich, aber die „Karte“ hat mit Geofencing doch gar nix zu tun: Du startest das Monitoring durch den CLLocationManager und solange Du es dort nicht wieder stoppst, wird die Region überwacht ... unabhängig davon, ob Du sie auf irgendeiner Karte darstellst.

    Soweit zumindest mein Verständnis.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • ja richtig, allerdings gebe ich mir die Regionen per Print in der Konsole aus, die gerade überwacht werden, diese sind identisch mit meinen Orten die gerade aktiv sind. Wenn ich durch eine "alte" Region laufe meldet die Funktion didEnterRegion das ich mich gerade in der "alten" Region befinde, daher dachte ich das das irgendwo noch zwischengespeichert wird.

    Quellcode

    1. func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
    2. print("Started Monitoring Region: \(region.identifier)")
    3. }
  • Ich verstehe Deine Frage nicht: Wenn die Region noch überwacht wird, hält der CLLocationManager doch bestimmt eine Referenz auf das entsprechende CLRegion-Objekt und damit wird dieses nicht freigegeben. Was hat das mit einer Persistierung in CoreData oder einer Karte zu tun?

    Was genau ist jetzt das Problem? Wenn eine „alte“ Region nicht mehr überwacht werden soll, stoppe das Monitoring doch einfach. Dann wird das CLRegion-Objekt (wahrscheinlich) auch freigegeben.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Quellcode

    1. self.manager.stopMonitoring(for: geofenceRegion)
    habe ich, aber wahrscheinlich an der Falschen Stelle und zwar in meiner Funktion OrteAnzeigen (siehe oben).

    Das Problem ist das ich irgendwelche Leichen drin habe die mir ein Ereignis auslösen und ich nicht genau weiß wohl diese kommen..
  • Überlege Dir doch bitte einmal in Ruhe, was Du machen willst: Vor dem Starten einer Überwachung diese zu stoppen, ist nicht sehr sinnvoll. Und beides beim Anzeigen zu tun, zumindest fragwürdig. Starte beim Anlegen der Region, Stoppe vor deren Löschung, und mach‘ das Ganze unabhängig von der Kartendarstellung...

    Vielleicht hilft es, ganz old-fashioned einmal ein Ablaufdiagramm zu erstellen. Irgendwie scheinen derartige Methoden aus der Mode gekommen zu sein ... Proper Prior Planning Prevents Piss Poor Performance :)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.