使用socket.io和Swift 3等待消息

时间:2017-01-23 21:50:19

标签: node.js swift socket.io server swift3

我有一台服务器,在10秒后发出一个真实的。如果iOS应用程序从服务器收到真正的值,我该怎么办? 10秒不是常数,我需要应用程序无论服务器需要多长时间都能获得布尔值。

我的应用程序将用于倒水,直至达到一定高度,然后它会在手机完成时通知您。

更新(更多信息):

我正在关注的指南链接: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()
        })
    }
}

我想做一些非常类似的事情,它不断地从服务器获取消息并将它们加载到视图中。但是,此代码不适用于Swift 3 / iOS 10,我无法找到有关如何更新它的任何文档。我试着简单地将它放入我的代码中,然后使用推荐的修复程序尝试使其工作,但它没有。

最后,我的服务器将托管在Pi Zero上,我需要通过服务器从Pi接收消息,说明水已达到适当的水平。 感谢

1 个答案:

答案 0 :(得分:2)

结果:

iOS源代码:

连接到服务器后。

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

您告诉服务器您想获得有关水箱水位的通知。

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

然后你在这里听通知:

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

注意:故意我没有包含updateViewWithLevelTank功能实现,因为我希望您专注于与服务器连接并通知水箱级别的重要部分除此之外,我认为模仿UIView动画并不复杂。

import UIKit
import SocketIO

class ViewController: UIViewController {
  @IBOutlet weak var tankView: UIView!
  let socket = SocketIOClient(socketURL: URL(string: "http://localhost:5000")!)

  override func viewDidLoad() {
    super.viewDidLoad()

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

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

    socket.connect()
  }

}

服务器源代码:

setInterval会调用匿名函数,直到levelTank为100。

其中匿名函数,每次调用levelTank时都会通知客户端(iOS套接字)。

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);
});

那么请告诉我这是否适用于您的情况,或者您需要对我的例子进行更多说明,可能我错过了一些知道的事情? ;)