仅当其他异步方法在Swift中完成工作时,如何才能异步调用某个方法?

问题描述:

我正在为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

后,你说你正在使用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