2016-12-17 3 views
1

Я хочу выполнить функцию, когда есть соединение сокета. Но методы могут быть запущены немедленно, когда есть соединение. Соединение должно быть выполнено, когда его нет.Асинхронные блоки завершения с одноточечным классом 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.

ответ

0

просто добавьте слушателя подключения, как показано ниже:

socket.on(clientEvent: .connect) { [unowned self] data, ack in 
      print("socket connected") 
      print(data) 
      if !self.HasConnected { 
       // JOIN YOUR ROOM 
       self.HasConnected = true 
      } 
     } 
Смежные вопросы