ios – 使用Swift 1.2进行同步请求的GCDAsyncSocket

ios – 使用Swift 1.2进行同步请求的GCDAsyncSocket,第1张

概述背景: 我正在使用Swift 1.2成功地在项目上使用GCDAsyncSocket(通过桥接头). 现在的挑战是它需要某种队列,因为它连接的系统一次只能处理和返回一个命令. 因此,如果它背靠背调用方法,例如: getSystemInfo()getSystemStatus() 只有getSystemInfo()通过委托回调返回,因为系统正在忙于处理它,但是,getSystemStatus()是异步 背景:

我正在使用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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1045186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存