2017-01-23 4 views
0

Ich habe einen Server, der nach 10 Sekunden eine wahr aussendet. Was kann ich tun, damit die iOS App wartet, bis sie den richtigen Wert vom Server erhält? Die 10 Sekunden sind nicht konstant, ich brauche die App, um den Booleschen Wert zu erhalten, egal wie lange der Server braucht.Warte auf Nachricht mit socket.io und Swift 3

Meine App wird verwendet, um Wasser zu gießen, bis es eine bestimmte Höhe erreicht, dann wird es Sie auf Ihrem Telefon benachrichtigen, wenn es fertig ist.

UPDATE (Mehr Infos):

Link zu leiten Ich verfolge: http://www.appcoda.com/socket-io-chat-app/

func getChatMessage(completionHandler: (messageInfo: [String: AnyObject]) -> Void) { 
    socket.on("newChatMessage") { (dataArray, socketAck) -> Void in 
     var messageDictionary = [String: AnyObject]() 
     messageDictionary["nickname"] = dataArray[0] as! String 
     messageDictionary["message"] = dataArray[1] as! String 
     messageDictionary["date"] = dataArray[2] as! String 

     completionHandler(messageInfo: messageDictionary) 
    } 
} 


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

    SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.chatMessages.append(messageInfo) 
      self.tblChat.reloadData() 
      //    self.scrollToBottom() 
     }) 
    } 
} 

ich etwas sehr ähnlich, dies tun möchten, die ständig Nachrichten vom Server bekommen und laden sie in die Aussicht. Dieser Code funktioniert jedoch nicht mit Swift 3/iOS 10, und ich kann keine Dokumentation darüber finden, wie er aktualisiert wird. Ich habe versucht, es einfach in meinen Code zu schreiben und dann die empfohlenen Korrekturen zu verwenden, um es zum Laufen zu bringen, aber das tat es nicht.

Am Ende wird mein Server auf einem Pi Zero gehostet und ich muss eine Nachricht von dem Pi über den Server erhalten, dass das Wasser das entsprechende Level erreicht hat. Dank

+0

Sie könnten einen Timer ausführen, der alle 1 Sekunde (oder alle 0,1 Sekunden oder was auch immer) ausgeführt wird und die Warnung sendet und den Timer beendet, wenn dies zutrifft –

Antwort

2

Ergebnis:

iOS Source Code:

Sobald Sie mit dem Server verbunden.

socket.on("connect") { data, ack in 
    self.socket.emit("get-notified-water", "") 
} 

Sie teilen dem Server mit, dass Sie über den Wassertank informiert werden möchten.

self.socket.emit("get-notified-water", "") 

Und dann hören Sie die Meldung hier:

socket.on("notification-water") { data in 
    let levelTank = data.0.first as! Int 
    self.updateViewWithLevelTank(levelTank) 
} 

HINWEIS: Absichtlich habe ich nicht updateViewWithLevelTank Funktionsimplementierung enthalten, da ich möchte Sie konzentrieren sich auf die wichtige Rolle, die mit verbindet der Server und wird mit der Wassertank-Ebene benachrichtigt, außerdem glaube ich nicht, dass es kompliziert ist, die UIView-Animation nachzuahmen.



Server Quellcode:

setInterval wird rufen die anonyme Funktion bis levelTank 100.

ist

, in dem die die anonyme Funktion, benachrichtigt den Client (iOS-Buchse) die levelTank jemals y Zeit wird aufgerufen.

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

var port = 5000; 

io.on('connection', function(socket) { 

    socket.on('get-notified-water', function(data) { 
    var levelTank = 0; 
    var intervalTime = 500; 

    var intervalId = setInterval(function() { 
     levelTank += 10 
     socket.emit('notification-water', levelTank); 

     if (levelTank === 100) { 
     clearInterval(intervalId) 
     } 
    }, intervalTime); 
    }); 

}); 

http.listen(port, function() { 
    console.log('server up and running at %s port', port); 
}); 

Lassen Sie mich wissen, ob dies für Ihren Fall funktioniert oder Sie benötigen mehr Klärung von meinem Beispiel, wahrscheinlich habe ich etwas verpasst wer weiß?;)

Verwandte Themen