2016-03-25 7 views
0

Ich baue eine App, die es regelmäßig mit Socket kommuniziert.Wie aktualisiert man ein Textfeld in regelmäßigen Abständen?

Solange der Socket offen ist, werden Daten von Zeit zu Zeit übertragen.

Allerdings aktualisieren sich meine textFields (die die Daten darstellen) nicht selbst, wenn nicht eine andere Ansicht eingeführt wird.

Photo

Aus dem Bild oben, zunächst meine Anwendung wird Scans für den QR-Code als Authentifizierungsmethode. Angenommen, die Authentifizierung ist erfolgreich und die erste Ansicht ist geladen (die Ansicht nach dem Navigationscontroller).

Das Problem ist, es dauerte ziemlich lange, um die Daten zu erhalten.

Code, der beschreibt, wie ich die Verbindung manövriere.

override func viewDidLoad() { 
    super.viewDidLoad() 
    print("First view loaded") 

    //add observer 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityStatusChanged", name: "ReachStatusChanged", object: nil) 
    reachabilityStatusChanged() 

} 


func reachabilityStatusChanged(){ 
    switch reachabilityStatus{ 
    case NOACCESS: 
     print("No access") 
     dispatch_async(dispatch_get_main_queue()){ 
      print("No-access") 
      self.displayAlertMessage("No internet access, please try again later") 
     } 
    default: 
     dispatch_async(dispatch_get_main_queue()){ 
      self.api.reportStatus() 
      self.api.importData() 
      socket.connect() 
//data will be sent to text field at this point 
     } 
    } 
} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    print("First view appeared") 

    self.circleProgressView.progress = progressSliderValue   

    dispatch_async(dispatch_get_main_queue()){ 
     self.distanceLabel.text = "\(appUserMileage)" 
     self.mileageLabel.text = "Target: \(appUserTarget) km" 
    } 
} 

Aus dem obigen Code, wie Sie als die Ansicht (die Ansicht nach der Navigation-Controller) geladen wird sagen können, überprüft es für den Netzzugang. Wenn das Netzwerk verfügbar ist, kommuniziert es mit dem Socket, aber zu dem Zeitpunkt, zu dem die Daten eintreffen, ist die Ansicht bereits geladen und erscheint, was bedeutet, dass zu diesem Zeitpunkt keine Daten angezeigt werden.

Gibt es eine Möglichkeit, die Ansichten regelmäßig zu aktualisieren? Ich habe einige Nachforschungen angestellt, aber bei allen handelt es sich um Hintergrunddaten, die für meinen Fall nicht geeignet sind.

Antwort

1

Ich weiß nicht, wo Ihre appUserMileage und appUserTarget Variablen leben, aber wie wäre es mit so etwas?

var appUserMileage: Int? { 
    didSet { 
     self.distanceLabel?.text = "\(appUserMileage ?? 0)" //? in case model calls this before outlets are loaded 
    } 
} 

var appUserTarget: Int? { 
    didSet { 
     self.mileageLabel?.text = "Target: \(appUserTarget ?? 0) km" 
    } 
} 
+0

Ich habe meine Variablen global deklariert (ich weiß, das ist eine schlechte Praxis, aber ich habe einige Fehler festgestellt lokal .... lange Geschichte), so konnte ich Ihre Methode nicht verwenden, weil es mich erfordert die Variablen neu deklarieren (Ich habe es versucht und es funktioniert nicht) –

Verwandte Themen