ios 代理模式如何转换成顺序执行的流程?

发布于 2022-09-03 08:30:16 字数 1970 浏览 11 评论 0

在ios平台我用NSInputStream 和 NSOutStream 与服务器进行socket 通信。INInputStream 有个NSSremDelegate的代理

extension TCPSocket: NSStreamDelegate {
    func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
        switch eventCode {
        case NSStreamEvent.None:
            
            break
        case NSStreamEvent.OpenCompleted:
            print("net stream ok!")
            // Maybe it's too long!
            guard let inputStream = inputStream, outputStream = outputStream where inputStream.streamStatus == .Open && outputStream.streamStatus == .Open else {
                break
            }
            if (aStream == inputStream) {
                isNetConnected = true
            }
        
            // break
        case NSStreamEvent.HasBytesAvailable:
            // 我在下面的函数中从流里面读取数据
            readFromStream()
            break
        case NSStreamEvent.ErrorOccurred:
            
            break
        case NSStreamEvent.EndEncountered:
            
            break
        case NSStreamEvent.HasSpaceAvailable:
            // here can output data.
            break
        default:
            break
        }
    }
}

我现在只能在代理中读取完服务器发来的数据,然后再调用数据处理函数,一步步调用下去。这样的话,如果服务器再来数据的话,我还是调用数据处理的函数,就得判断要处理哪一块业务逻辑。

// 伪代码
func readFromStream() {
    // 读取socket中的数据
    buffer = socket.read()
    // 处理这些数据
    handleData(buffer)
}

func handleData(buffer) {
    // 判断处理哪个业务逻辑,每次服务器来数据都要走一次
    swich state 
    case 1down:
        dosomthing
    case 2down:
        dosomthing
    case 3down:
        dosomthing
}

上面的这种流程下,服务器来数据,整个流程我都得从上到下判断一遍,而且每次业务逻辑执行完成,还要设置相应的状态。
我能不能把上面的这种使用代理情况转换成下面这种流程:

// 伪代码
// 首先给服务器发送数据
sendSomeDataToServer()
// 读取服务器相应的数据,buffer中包含有socket返回的数据
readFromSocket(buffer)
// 处理收到的数据
handleData(buffer)

上面的过程是根据业务流程,自己写代码驱动的,而不是像第一段代码由代理去调用的,也就是我需要从服务器拿数据的时候,程序就等待服务器的数据,读到一定长度的数据后,执行其他的流程。如何才能完成这样的转化呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青朷 2022-09-10 08:30:16

你这个问题还真是很抽象呢
1、接收或发送数据是一个独立的功能,假设为sendRead,把它和业务拆开。这样接收数据的时候就只管接收数据,等到数据到你要的标准了,从sendRead模块回调出来。
readFromSocket(buffer)
这个方法就可以改造成带一个闭包(block)回调的样式:

func readFromSocket(data:NSData,completeHander:(receivedData:NSData?)-> Void){
    //接收数据的事

    //在某个时机调用回调,应该不是当前这个方法里,接收数据应该都是异步的吧
    completeHander(receivedData: xxx)
}

你的业务执行到某个阶段,你需要某个数据了,调用这个,然后在回调里处理。这时回调里只需要处理这个阶段的逻辑。虽然这样还是无法做到顺序调用,因为接受数据不可能一下完成,肯定是要等数据接受方主动通知的。

2、我看你handleData里面之前要做多状态判断,是这个业务是多线程同时运作的吗?如果不是感觉会比较简单些,因为APP当前就一个状态,只需要做好单个状态的数据先集中然后丢给业务代码处理就好了。否则,要把业务逻辑分隔开来,读取操作也要分隔开吧。

九公里浅绿 2022-09-10 08:30:16

怎么这么多拼写错误?强迫症表示很难受

离旧人 2022-09-10 08:30:16

ReactiveCocoas or RxSwift

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文