如何仅当其他异步方法在 Swift 中完成工作时才异步调用方法?
How can I call asynchronously a method only when other async method finishes working in Swift?
我正在为 swift
实现 socket.io
库。
有一个与连接服务器相关的方法,如下所示:
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
中。一旦此方法完成并且我的应用程序连接到服务器,我想 post 一个 NSNotification
,例如:
NSNotificationCenter.defaultCenter().postNotificationName(setConnectionStatus, object: self)
所以我的问题是 - 我应该如何修改我的 connectToServerWithNickname
方法,以便它在一切正常时调用我的 nsnotificationcenter
?
在您声明您正在使用 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.
}
编辑:
对于个人发射,您将保留一个指向套接字的指针并使用
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
}
我正在为 swift
实现 socket.io
库。
有一个与连接服务器相关的方法,如下所示:
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
中。一旦此方法完成并且我的应用程序连接到服务器,我想 post 一个 NSNotification
,例如:
NSNotificationCenter.defaultCenter().postNotificationName(setConnectionStatus, object: self)
所以我的问题是 - 我应该如何修改我的 connectToServerWithNickname
方法,以便它在一切正常时调用我的 nsnotificationcenter
?
在您声明您正在使用 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.
}
编辑:
对于个人发射,您将保留一个指向套接字的指针并使用
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
}