如何制作一个基本的swift 4 socket io应用程序

时间:2018-02-07 19:36:13

标签: ios swift socket.io

我一直在尝试创建一个连接到我的节点服务器的基本swift 4应用程序,并运行我为此应用程序的Web版本提供的事件。使用下面的代码,它可以毫无障碍地无缝连接到服务器,但另一方面,我显然不会向此闭包外部的套接字发出,因为套接字是使用viewDidLoad()定义的。

如果我尝试在这个函数之外移动套接字声明,它会给我这个错误:

  

“无法在属性初始化程序中使用实例成员'manager';属性初始化程序在'self'可用之前运行”。

我试图查看许多不同的文档,但没有成功。

@IBOutlet weak var messagesBody: UITextView!
@IBOutlet weak var newMessageInput: UITextField!
@IBOutlet weak var newMessageSubmit: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    let manager = SocketManager(socketURL: URL(string: "http://localhost:3000/chat.html?name=developer&room=test")!, config: [.log(true), .compress])
    let socket = manager.defaultSocket

    socket.connect()

    newMessageSubmit.addTarget(self, action: #selector(sendNewMessage), for: .touchUpInside)
}

@objc func sendNewMessage() {
    let newMessageContent = newMessageInput.text!
    print("Sending message..." + newMessageContent)
    // socket.emit("createMessage", newMessageContent)
    // right here ^^^^^
}

1 个答案:

答案 0 :(得分:0)

首先,正如错误所说,你不能使用viewDidLoad之外的管理器实例属性来启动套接字,如果你想在任何方法中访问变量,你必须将它声明为全局,所以它的范围是整个类。此代码使用socket变量:

var socket:SocketIOClient!

override func viewDidLoad() {
   super.viewDidLoad()

   let manager = SocketManager(socketURL: URL(string: "http://localhost:3000/chat.html?name=developer&room=test")!, config: [.log(true), .compress])

   self.socket = manager.defaultSocket

   self.socket.connect()

   newMessageSubmit.addTarget(self, action: #selector(sendNewMessage), for: .touchUpInside)
}

@objc func sendNewMessage() {

   let newMessageContent = newMessageInput.text!

   print("Sending message..." + newMessageContent)

   self.socket.emit("createMessage", newMessageContent)

}