2016-05-23 7 views
0

Ich benutze einen NSTimer in einer iOS App im Hintergrund, die einige Daten alle 30 Sekunden in einem Array speichert. Die App zeigt die letzten 10 Werte (Werte von 5 Minuten) in einem Liniendiagramm an.NSTimer mit Zeichnung barChart im Hintergrund

Mein Problem ist es, die Funktion des Speicherns von Daten in das Array alle 30 Sekunden auch im Hintergrund, wenn die App nicht auf dem Bildschirm ist. Ich habe eine Menge Themen dazu geschrieben, aber ich verstehe es nicht.

Mein Timer ist die folgende:

timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: (#selector(ViewController.counting)), userInfo: nil, repeats: true) 
func counting() { 
timerCounter += 1 //Int 
if timerCounter%30==0 { 
    arrayOfValues.append(...) //Appending the array 
    reloadLineChart() // reload chart 
} 
} 

Könnte mir jemand zeigen, wie dieses Problem zu lösen? Ich weiß, da muss etwas mit den background-Methoden im ViewController sein, aber jetzt nicht was ich eintippen soll. Ich denke, es muss eine Funktion geben, die im Hintergrund zählt und eine Funktion, die das Diagramm neu lädt, wenn ich bin wieder in der App.

Antwort

0

In AppDelegate können Sie diese Methode verwenden:

func applicationWillResignActive(application: UIApplication) {} 

Der Code, den Sie in dieser Funktion hinzufügen, wird direkt vor Ihrer App im Hintergrund geht laufen. Daher können Sie dort den Code schreiben, um den Zähler zu stoppen.

Danach müssen Sie die folgende Funktion verwenden, um den Zähler wieder zu aktivieren:

func applicationWillEnterForeground(application: UIApplication) {} 

Der Code, den Sie in dieser Funktion schreiben, wird ausgeführt, wenn Sie wieder in die App zurückkommen. Hoffe es ist klar genug.

+0

Vielen Dank. Das ist klar. :) Aber mein Problem ist, dass ich auf Methoden von meiner ViewControllerClass in AppDelegate zugreifen möchte, weil der Timer dort definiert ist. – FranzFerdinand

1

Ich verstehe vielleicht, dass Sie den Zähler in App-Delegaten nicht deklarieren wollen, aus welchen Gründen auch immer, obwohl ich es empfehlen würde. Sie können jedoch die genannten Funktionen aus derselben Klasse aufrufen, in der Sie den Zähler definiert haben. Sie müssten es so nennen:

override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(
     self, 
     selector: "applicationWillResignActive:", 
     name: UIApplicationWillResignActiveNotification, 
     object: nil) 
} 

func applicationWillResignActive(notification: NSNotification) { 
    // stop your counter 
} 

Dann machen Sie das gleiche mit der anderen Funktion. Die Hoffnung ist klar.

+0

Hallo. Diese Funktion funktioniert, vielen Dank. Jetzt habe ich zwei Beobachter-Funktionen für resignActive und enterForeground, das ist gut. Aber meine letzte Frage ist nicht klar. Ich habe diesen Timer in meiner App. Wie kann ich den Code sagen, dass er auch im Hintergrund laufen muss und Daten in das Array schreiben soll? – FranzFerdinand

+0

Zusatz: Ja ich weiß, es gibt einen besseren Weg, aber ich lerne immer noch und für diesen Moment ist das besser. Ich werde nach dem besseren Weg suchen, wenn ich das MVC-Konzept in iOS-Apps noch besser verstehe. – FranzFerdinand

+0

Sie haben mehrere Möglichkeiten ... Ich würde Ihnen empfehlen, diesem Beispiel zu folgen: http: //stackoverflow.com/questions/28313702/trying-to-implement-beginbackgroundtaskwithexpirationhandler-and-uilocalnotifica Ich würde auch hinzufügen, dass iOS nur Ihre erlaubt Funktion, die 10 Minuten lang im Hintergrund läuft. –