背景:
我已经在一个项目中成功地使用了 Swift 1.2(通过桥接头文件)中的GCDAsyncSocket
。
现在的挑战是它需要某种队列,因为它连接到的系统一次只能处理并返回一个命令。
所以如果它连续调用方法,例如:
getSystemInfo()
getSystemStatus()
只有通过委托回调返回getSystemInfo()
,因为系统正在忙于处理它,但getSystemStatus()
已经成功地异步
发送,但没有被控制器处理。我希望能够连续进行调用,并在控制器完成处理并返回上一个响应后将它们排队和处理--基本上使过程同步。
问题:
如下面的示例代码所示,在didConnectToHost
委托回调中,当它连接到控制器时,它会连续调用getSystemInfo()
然后是getSystemStatus()
,它应该在获取系统信息的结果后调用getSystemStatus()
。
我一直在研究NSCondition
、NSOperation
,甚至GCD,但我不确定最优雅的方法是什么。我不想再添加另一个队列处理器,因为已经为GCDAsyncSocket
设置了队列。处理这个的最佳、最优雅的方式是什么?
伪类代码:
public class SendNet: NSObject, GCDAsyncSocketDelegate {
var socket:GCDAsyncSocket! = nil
func setupConnection(){
var error : NSError?
if (socket == nil) {
socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
} else {
socket.disconnect()
}
if (!socket.connectToHost(host, onPort: port, withTimeout: 5.0, error: &error)){
println("Error: \(error)")
} else {
println("Connecting...")
}
}
public func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16) {
println("Connected to \(host) on port \(p).")
self.socket = socket
getSystemInfo()
getSystemStatus()
}
func send(msgBytes: [UInt8]) {
var msgData = NSData(bytes: msgBytes, length: msgBytes)
socket.writeData(msgData, withTimeout: -1.0, tag: 0)
socket.readDataWithTimeout(-1.0, tag: 0)
}
func getSystemInfo() {
var sendBytes:[UInt8] = [0x0, 0x1, 0x2, 0x3]
send(sendBytes)
}
func getSystemStatus() {
var sendBytes:[UInt8] = [0x4, 0x5, 0x6, 0x7]
send(sendBytes)
}
public func socket(socket : GCDAsyncSocket!, didReadData data:NSData!, withTag tag:Int){
var msgData = NSMutableData()
msgData.setData(data)
var msgType:UInt16 = 0
msgData.getBytes(&msgType, range: NSRange(location: 2,length: 1))
println(msgType)
}
}
任何建议都将是极好的 - 谢谢!