我正在使用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) }}
任何建议都会很棒 – 谢谢!
解决方法 所以我决定使用NSOperation.使用以下代码创建了一个名为SyncRequest.swift的类文件:
import Foundationclass SyncRequest : NSOperation { var socket:GcdasyncSocket! = nil var msgData:NSData! = nil overrIDe var concurrent: Bool { return false } overrIDe var asynchronous: Bool { return false } private var _executing: Bool = false overrIDe var executing: Bool { get { return _executing } set { if (_executing != newValue) { self.willChangeValueForKey("isExecuting") _executing = newValue self.dIDChangeValueForKey("isExecuting") } }}private var _finished: Bool = false;overrIDe var finished: Bool { get { return _finished } set { if (_finished != newValue) { self.willChangeValueForKey("isFinished") _finished = newValue self.dIDChangeValueForKey("isFinished") } }}/// Complete the operationfunc completeOperation() { executing = false finished = true}overrIDe func start() { if (cancelled) { finished = true return } executing = true main()} overrIDe func main() -> (){ println("starting...") NSNotificationCenter.defaultCenter().addobserver(self,selector: "dIDReadData:",name: "DIDReadData",object: nil) sendData()} func sendData() { socket.writeData(msgData,tag: 0) println("Sending: \(msgData)") socket.readDataWithTimeout(-1.0,tag: 0) } func dIDReadData(notif: NSNotification) { println("Data Received!") NSNotificationCenter.defaultCenter().removeObserver(self,object: nil) completeOperation() }}
然后,当我需要向控制器发送内容时,我会执行以下 *** 作:
// sync the request to the controllerlet queue = NSOperationQueue() // sync request queuelet requestoperation = SyncRequest()requestoperation.socket = socket // pass the socket to send throughrequestoperation.msgData = msgData // pass the msgData to sendqueue.maxConcurrentoperationCount = 1queue.addOperation(requestoperation)
当数据从处理GcdasyncSocket的“dIDReadData”委托的位置进入时,不要忘记发送NSNotification.
public func socket(socket : GcdasyncSocket!,withTag tag:Int){ ... NSNotificationCenter.defaultCenter().postNotificationname("DIDReadData",object: data) ...}总结
以上是内存溢出为你收集整理的ios – 使用Swift 1.2进行同步请求的GCDAsyncSocket全部内容,希望文章能够帮你解决ios – 使用Swift 1.2进行同步请求的GCDAsyncSocket所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)