2016-12-17 13 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); 

所以它看起來像在viewDidLoad中作出的插座連接的心不是:當我按下了一個按鈕,這個代碼是它的工作原理。但是爲什麼當我按下按鈕時它會工作?因爲我正在等待來自SocketIOManger類連接的connectTo Room函數的回調函數。

回答

0

只需添加一個監聽器連接如下圖所示:

socket.on(clientEvent: .connect) { [unowned self] data, ack in 
      print("socket connected") 
      print(data) 
      if !self.HasConnected { 
       // JOIN YOUR ROOM 
       self.HasConnected = true 
      } 
     }