ios 代理模式如何转换成顺序执行的流程?
在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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你这个问题还真是很抽象呢
1、接收或发送数据是一个独立的功能,假设为sendRead,把它和业务拆开。这样接收数据的时候就只管接收数据,等到数据到你要的标准了,从sendRead模块回调出来。
readFromSocket(buffer)
这个方法就可以改造成带一个闭包(block)回调的样式:
你的业务执行到某个阶段,你需要某个数据了,调用这个,然后在回调里处理。这时回调里只需要处理这个阶段的逻辑。虽然这样还是无法做到顺序调用,因为接受数据不可能一下完成,肯定是要等数据接受方主动通知的。
2、我看你handleData里面之前要做多状态判断,是这个业务是多线程同时运作的吗?如果不是感觉会比较简单些,因为APP当前就一个状态,只需要做好单个状态的数据先集中然后丢给业务代码处理就好了。否则,要把业务逻辑分隔开来,读取操作也要分隔开吧。
怎么这么多拼写错误?强迫症表示很难受
ReactiveCocoas or RxSwift