Я хочу выполнить функцию, когда есть соединение сокета. Но методы могут быть запущены немедленно, когда есть соединение. Соединение должно быть выполнено, когда его нет.Асинхронные блоки завершения с одноточечным классом swift
Что такое хороший и правильный способ решить эту проблему?
import SocketIO
class SocketIOManager: NSObject {
static let sharedInstance = SocketIOManager()
var socket: SocketIOClient = SocketIOClient(socketURL: NSURL(string: "http://192.168.1.59:3000")! as URL)
var connectionMade = false;
override init() {
super.init()
}
func establishConnection(completionHandler: (() -> Void)!) {
if(!connectionMade){
socket.connect()
connectionMade = true;
}
completionHandler();
}
func connectToRoom(roomNumber: String){
establishConnection {
self.socket.emit("connectToRoom", roomNumber);
}
}
}
Это хорошая настройка? И да, я должен установить bool на false, когда соединение закрыто :)
Я спрашиваю об этом, потому что у меня проблема с моим кодом. Я называю это в приложение делегата из-соединения:
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
SocketIOManager.sharedInstance.establishConnection {
}
}
И это на мой взгляд контроллера:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
SocketIOManager.sharedInstance.connectToRoom(self.roomNumber);
}
Но сервер никогда не получаю connectToRoom «сообщение». Она работает, когда я нажимаю на кнопку, с помощью этого кода в нем:
SocketIOManager.sharedInstance.connectToRoom(self.roomNumber);
Так это выглядит как соединение гнездо ISNT сделанное на viewdidload. Но почему это работает, когда я нажимаю кнопку? Потому что я жду обратного вызова в функции connectTo Room из соединения в классе SocketIOManger.