2016-05-02 14 views
0

Ich habe ein Programm in SWIFT, das erkennt, wenn ein Beacon oder mehrere Beacons außerhalb des Bereichs sind und basierend auf , dass es so etwas wie das Speichern einiger Daten in der Datenbank usw. funktioniert. Alles funktioniert gut , aber ich bekomme viele falsch positive auf eine Weise, dass "didExitRegion" gefeuert und wenige Sekunden später "didEnterRegion" gefeuert wird, während ich nicht bewegt worden bin usw. Ich weiß, dass dies viel mit der Abstimmung zu tun hat von den Beacons und ihren Qualitäten, aber in dieser Zeit habe ich eine alternative Lösung gefunden.
Also entschied ich mich, NSTimer zu verwenden, um zu sehen, ob ich wirklich außerhalb der Reichweite bin oder ist es nur ein falsches positives, das ich bekomme? Wenn also didExitRegion ausgelöst wird, starte ich 60 Sekunden lang einen NSTimer. Wenn die 60 Sekunden oben sind und didEnterRegion kein Feuer bekommen hat, dann weiß ich Ich bin wirklich außerhalb der Reichweite und führe jede Art von Datenrettung durch, die ich machen muss. Sonst, wenn didEnterRegion innerhalb dieser 60 Sekunden aufgerufen wird, dann nehme ich an, dass es ein falscher positiver war und annulliere den nstimer und mache nichts.Verwenden Sie NSTimer zur besseren Validierung von Beacon

Alles funktioniert gut, solange ich mit einem Beacon arbeite. Das Problem mit Timer ist, wenn mehrere Beacons außerhalb der Reichweite gehen. lässt sagen, erste Beacon ist außerhalb des Bereichs, so dass ExitRegion Feuer und startet den NSTimer Lassen Sie uns sagen, 20 Sekunden später zweite Beacon ist Off-Bereich und wieder didExitRegion wird gefeuert und dass man den NSTimer wieder gestartet. Nun meine NSTimer ist alles nicht mehr synchron und zu dieser Zeit, die Dinge funktionieren nicht richtig, und die NSTimer selbst kontinuierlich zu starten, wenn 60 Sekunden oben und usw.

Also meine Frage ist, was die Arbeit um diese Lösung? Wie kann ich meinen nstimer synchron halten, wenn er erneut aufgerufen wird, bevor er ungültig gemacht wird? Gibt es einen besseren Weg zu dieser Lösung? Auch hier weiß ich, dass eine bessere Qualität Beacons helfen kann, aber das ist keine Option für mich in dieser Zeit.

Antwort

1

Eine Lösung ist ein Wörterbuch wie folgt zu halten:

var pendingExits = Dictionary<CLBeaconRegion,NSDate>()

Jedes Mal, wenn Sie einen Anruf erhalten didExitRegion:

  • Nur die NSTimer starten, wenn das Wörterbuch leer ist - anders Angenommen, der Timer läuft bereits.

  • Fügen Sie die Region zum Wörterbuch zusammen mit einer neuen NSDate() hinzu, um den Zeitstempel des Hinzufügens festzulegen.

Wenn Sie erhalten einen didEnterRegion Rückruf:

  • Blick für die Region im Wörterbuch. Wenn es da ist, entferne es.

Wenn der Timer erlischt:

  • Geben Sie für jeden Eintrag mit einem Zeitstempel 60 Sekunden oder mehr alt. Entfernen Sie dazu die Region aus dem Wörterbuch und feuern Sie Ihre benutzerdefinierte Beendigungslogik ab.

Finden Sie den neuesten verbleibenden Zeitstempel (falls vorhanden) im Wörterbuch.Starten Sie den Timer zu diesem Zeitpunkt plus 60 Sekunden.