2016-04-27 61 views
0

我正在爲swift實施socket.io庫。僅當其他異步方法在Swift中完成工作時,如何才能異步調用某個方法?

有相關連接(如下所示)的服務器的方法:

func connectToServerWithNickname(nickname: String) { 
     socket.emit("connectUser", nickname) 
} 

socket.emit電話:

private func _emit(data: [AnyObject], ack: Int? = nil) { 
    dispatch_async(emitQueue) { 
     guard self.status == .Connected else { 
      self.handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true) 
      return 
     } 

     let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: self.nsp, ack: false) 
     let str = packet.packetString 

     DefaultSocketLogger.Logger.log("Emitting: %@", type: self.logType, args: str) 

     self.engine?.send(str, withData: packet.binary) 
    } 
} 

,你可以看到這一切都裝在dispatch_async。我想盡快張貼NSNotification因爲這種方法做,我的應用程序連接到服務器,某事像:

NSNotificationCenter.defaultCenter().postNotificationName(setConnectionStatus, object: self) 

所以我的問題是 - 我應該如何修改我的connectToServerWithNickname方法,使其調用我的nsnotificationcenter什麼時候一切正常?

+0

'只要這個方法完成,我的應用程序連接到服務器'這是否意味着它可以在'self.engine?.send(str,withData:packet.binary)'行之後完成,或者在發送通知之前,您是否必須等待服務器響應以確保您已連接? – Moritz

+0

我知道有確認連接成功的'ack'數據,所以對我來說,獲得這些信息然後調用'NSNotificationCenter'是完美的。否則 - 如果這是不可能的 - 我可以留在第一個選項,雖然 – user3766930

+0

你沒有套接字監聽器,就像onEvents,當你收到連接的消息時會觸發? – SeanLintern88

回答

2

後,你說你正在使用socket.IO

當您在連接之前,你將有

var socket: SocketIOClient = SocketIOClient(socketURL: NSURL(string: "http://192.168.1.XXX:3000")!) 

那麼在此之後把

socket.on("connect") { (data, ack) -> Void in 
     // This will be fired once your socket connects. 
    } 

EDIT使您的插座實例:

對於個人排放,你會保持一個指向你的並使用

 let json = ["things_i_need_to_send" : stuff] 

    socket.emitWithAck(Place_i_need_to_send_to, json)(timeoutAfter: 3) { data in 
     //This is called on completion 
    } 

所以使用你的上面的例子。

socket.emitWithAck(connectUser, nickname)(timeoutAfter: 3) { data in 
     //This is called on completion 
    } 
+0

有沒有辦法在這裏檢查完成處理程序? – user3766930

+0

謝謝!最後一個問題 - 這裏的timeoutAfter是什麼? – user3766930

+0

呼叫超時前的時間(以秒爲單位)並被視爲失敗。 – SeanLintern88