【问题标题】:Wait for message using socket.io and Swift 3使用 socket.io 和 Swift 3 等待消息
【发布时间】:2017-06-08 13:14:00
【问题描述】:

我有一个服务器,它会在 10 秒后发送一个 true。我该怎么做才能让 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.1 秒或其他)运行的计时器,如果为真,则发送警报并结束计时器

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


【解决方案1】:

结果:

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。

其中匿名函数,每次调用都会通知客户端(iOS socket)levelTank

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

所以让我知道这是否适用于您的情况,或者您需要对我的示例进行更多说明,可能我错过了一些谁知道的东西? ;)

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2020-08-28
    • 2019-05-09
    相关资源
    最近更新 更多